如何在SPARQL中找到包含每组项目的列表?假设我有这些数据:
<http://foo.org/test> <http://foo.org/name> ( "new" "fangled" "thing" ) .
<http://foo.org/test2> <http://foo.org/name> ( "new" "york" "city" ) .
如何查找列表中包含“new”和“york”的项目? 以下SPARQL不起作用,因为过滤器适用于?t 的每个绑定,而不是所有绑定。
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?s ?p WHERE {
?s <http://foo.org/name>/rdf:rest*/rdf:first ?t
FILTER( ?t = "new" && ?t = "york")
}
答案 0 :(得分:7)
如果您要查找包含多个值的所有的列表,则需要使用更复杂的查询。此查询会查找具有?list 值的所有?值,然后过滤掉那些不的单词<列表中的em> not 。使用值块指定单词列表。
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select ?s {
?s <http://foo.org/name> ?list .
filter not exists { #-- It's not the case
values ?word { "new" "york" } #-- that any of the words
filter not exists { #-- are not
?list rdf:rest*/rdf:first ?word #-- in the list.
}
}
}
--------------------------
| s |
==========================
| <http://foo.org/test2> |
--------------------------
另一方面,如果您只是尝试搜索多个选项中的一个,那么您使用的是正确的属性路径,但是您的错误过滤器表达式。您希望字符串等于“new”或“york”。没有字符串等于“new”和“york”。您只需要过滤(?t =“new”||?t =“york”)或者更好地使用in:过滤器(?t in(“new” “,”“约克”))。以下是结果的完整示例:
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select ?s ?t {
?s <http://foo.org/name>/rdf:rest*/rdf:first ?t .
filter(?t in ("new","york"))
}
-----------------------------------
| s | t |
===================================
| <http://foo.org/test2> | "new" |
| <http://foo.org/test2> | "york" |
| <http://foo.org/test> | "new" |
-----------------------------------