我有一些包含属性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属性来维护顺序)。
答案 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" |
---------------