查找包含集合中所有值的列表?

2023-11-24

如何在 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 不起作用,因为filter适用于每个绑定?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")   
}

查找具有多个必需值的列表

如果您正在寻找包含以下内容的列表all如果有多个值,您将需要使用更复杂的查询。该查询找到所有?s值有一个?list值,然后过滤掉那些有的not一个词是not在列表中。单词列表是使用指定的values block.

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”or“约克”。没有字符串等于“new”and“约克”。你只需要做过滤器(?t =“新”||?t =“约克”)或者更好地使用in: 过滤器(?t in(“新”,“约克”))。这是一个包含结果的完整示例:

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"  |
-----------------------------------
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找包含集合中所有值的列表? 的相关文章

随机推荐