2016-05-13 77 views
0

我有一个数据集,其资源使用许多前缀。我想查找所有不是来自两个特定前缀的资源。sparql获取所有不是来自特定前缀的主题

我执行此查询:

select * 
where 
{ 

?s ?p ?o . 
    bind (strafter(str(?s), "#") as ?prefix) 
    filter (?prefix != "http://www.first.com/to#") 
    filter (?prefix != "http://www.second.com/rs#") 
} 
limit 10 

这并不起作用,因为

strafter(str("http://www.first.com/to#test")给我testhttp://www.first.com/to#

有谁知道如何获得前缀吗?

+0

对于这种方法,您需要[strbefore](https://www.w3.org/TR/sparql11-query/#func-strbefore),而不是[strafter](https://www.w3。组织/ TR/sparql11查询/#FUNC-strafter)。在文档中有一些示例显示了它们的作用:'strbefore(“abc”,“b”)=>“a”'和'strafter(“abc”,“b”)=>“c”'。 –

+0

@JoshuaTaylor你好,感谢评论,我问了一个关于meta的问题,你可以/可能知道它:) https://meta.stackoverflow.com/questions/323271/how-to-give-minimum-example-when我的问题是在数据的大小,你可以帮助吗? –

+0

这是您的大型数据集中发生空投注异常的设置吗?如果某个URI的形式为'http:// example.org/foo/bar',即没有'#',那么我不会感到惊讶,因此可能会得到一个空字符串期待它。 (这只是一个普遍的猜测,不一定是这里发生了什么) –

回答

0

STRBEFORE应该工作。即:

select * 
where 
{ ?s ?p ?o . 
    BIND(STRBEFORE(str(?s), "#") as ?prefix) 
    FILTER (?prefix != "http://www.first.com/to") 
    FILTER (?prefix != "http://www.first.com/rs") 
} 

或者你可以使用STRSTARTS

select * 
where 
{ ?s ?p ?o . 
    FILTER (!(STRSTARTS(str(?s), "http://www.first.com/to#"))) 
    FILTER (!(STRSTARTS(str(?s), "http://www.first.com/rs#"))) 
} 

regex也可用于:

select * 
where 
{ ?s ?p ?o . 
    FILTER (!(regex(str(?s), "http://www.first.com/to|http://http://www.first.com/rs[#/]"))) 
} 

...这会允许的URI以斜线或哈希结束如果这是一个问题。

+0

这是一个选项,但如果其他约定用于前缀,则它不会扩展(例如,斜杠)。您也可以使用** strstarts **来检查一个字符串是否以特定前缀开头。 –

+0

OP特别依赖于使用'#'。我通常使用strstarts,所以也会添加。 – scotthenninger

+0

STRSTARTS选项中的@scotthenninger是否应该是否定的FILTER表达式,因为它在另外两个选项中? –