SPARQL查询返回任意对象集

时间:2015-04-16 14:24:20

标签: rdf sparql semantic-web

我有一些包含属性hasNextSibling的数据。我希望能够查询任意一组兄弟姐妹。我可以轻松地获取特定点之后的所有兄弟姐妹,但是如何检索X和Y之间的兄弟姐妹。

例如,数据模型是Old-Lady-in-the-Shoe的孩子。一些兄弟姐妹依次是Fred,Brandy,Chris,Zack,Emma,Brad [等等]。这个清单当然要长得多。我希望有能力说“把我从Brandy到兄弟的所有兄弟姐妹给我” - 回归Brandy,Chris,Zack,Emma。

我的查询类似于:

SELECT ?name WHERE {
    ?kid rdfs:label 'Brandy' .
    ?kid local:hasNextSibling+ ?sib .
    ?sib rdfs:label ?name .
    // this is where I need to stop if ?name = 'Emma'
    // but the graph still needs to complete and return all the other siblings
}

我不能简单地过滤?name小于我的结束名称,因为标签(名称)不是任何可确定或自然的顺序(因此需要hasNextSibling属性来维护顺序)。

1 个答案:

答案 0 :(得分:1)

假设你有这样的数据,带有标签的孩子和hasNextSibling属性:

@prefix : <urn:ex:> .

:a :label 'a' ; :hasNextSibling :b .
:b :label 'b' ; :hasNextSibling :c .
:c :label 'c' ; :hasNextSibling :d .
:d :label 'd' ; :hasNextSibling :e .
:e :label 'e' ; :hasNextSibling :f .
:f :label 'f' ; :hasNextSibling :g .
:g :label 'g' .

使用属性路径,您可以搜索具有向后hasNextSibling链的孩子到您想要的范围中的第一个,并将前一个hasNextSibling链搜索到您想要的范围中的最后一个:

prefix : <urn:ex:>

select ?kid ?label where {
  ?kid ^:hasNextSibling* [:label 'b'] ;
       :hasNextSibling* [:label 'd'] ;
       :label ?label .
}

---------------
| kid | label |
===============
| :b  | "b"   |
| :c  | "c"   |
| :d  | "d"   |
---------------

如果您希望其中任何一个是独占范围,则可以使用+属性路径而不是*属性路径。

prefix : <urn:ex:>

select ?kid ?label where {
  ?kid ^:hasNextSibling+ [:label 'b'] ;
       :hasNextSibling+ [:label 'f'] ;
       :label ?label .
}

---------------
| kid | label |
===============
| :c  | "c"   |
| :d  | "d"   |
| :e  | "e"   |
---------------