2015-04-16 46 views
0

我有一些數據包含屬性hasNextSibling。我希望能夠查詢任意一組的兄弟姐妹。我可以很容易地得到所有兄弟姐妹在一個特定的點後,但我怎麼能檢索X和Y之間的兄弟姐妹。SPARQL查詢返回任意一組對象

例如,數據模型是老鞋子的孩子。有些兄弟姐妹是Fred,Brandy,Chris,Zack,Emma,Brad [等等]。這個清單當然要長得多。我想要說「給我所有從白蘭地到艾瑪的兄弟姐妹」的能力 - 返回白蘭地,克里斯,扎克,艾瑪。

我想有一個查詢是這樣的:

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

SPARQL首先生成整個列表,然後對其過濾。所以你的過濾器將在查詢執行後執行。你認爲什麼是這個問題? – Artemis

+0

「因此需要同級屬性」您是否意味着該命令隱含在hasNextSibling屬性中?例如,firstSibling hasNextSibling secondSibling。 secondSibling hasNextSibling thirdSibling等?對於它的價值,如果示例兄弟姐妹沒有按字母順序排列,可能會避免一些混淆。 –

+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" | 
--------------- 
+0

謝謝。有沒有辦法在SPARQL 1.0中實現相同的功能? –

+0

@WayneWeibel SPARQL 1.0中沒有屬性路徑(至少它不是標準的一部分;有些實現可能具有屬性路徑,但不包括SPARQL 1.1的其餘部分,因此檢查特定實現你正在使用),所以這種方法是行不通的。我不認爲有一種方法可以在SPARQL 1.0中以數據結構化的方式執行此操作。 –