2013-03-19 54 views
2

我正在研究一個使用RDF的新項目,只是學習它和SPARQL。我認爲這個查詢會比現在要容易的多。SPARQL - 完成集合所需的主題

鑑於此店(簡化了本體)

Person1 -Owns-> Part1 
Person2 -Owns-> Part1 
Person2 -Owns-> Part2 
Part1 -PartOf-> Product1 
Part2 -PartOf-> Product1 

我試圖返回一個人需要完成產品的所有零件。

給定Person1,他需要Part2來完成Product1。 鑑於Person2,他不需要任何東西,因爲他擁有製作Product1的所有零件。

我想在1個查詢中返回每個產品的所有人員和所有需要的部件,但是認爲要開始更小,只是試圖找到特定人員需要的部件。真實的數據有多種產品和部件,可能在多種產品中(即螺絲在很多產品中)以及擁有屬於多種產品的部件的人員。一旦我可以獲得子集查詢的工作,我應該能夠擴展它。

select ?parts 
where 
{ 
    ?parts <PartOf> <Product1> . 
    minus {<Person1> <Owns> ?parts} 
} 

我的想法是讓所有的產品1的部分零件,然後消除PERSON1擁有的部分。但是我得到了Product1中的所有部分。我嘗試了很多其他查詢,但是在閱讀完教程和書籍之後,這對我來說是最符合邏輯的。有人可以指出我哪裏錯了嗎?

感謝您的時間。

回答

2

您正在使用哪種查詢軟件,以及您的數據實際是什麼樣的?我試過用apache jena如下:

@prefix ex: <http://example.com/> . 

ex:person1 ex:owns ex:part1 . 
ex:person2 ex:owns ex:part1 . 
ex:person2 ex:owns ex:part2 . 

ex:part1 ex:partOf ex:product1 . 
ex:part2 ex:partOf ex:product1 . 

和查詢:

prefix ex: <http://example.com/> 

select ?parts 
where 
{ 
    ?parts ex:partOf ex:product1 
    minus { ex:person1 ex:owns ?parts } 
} 

結果:

$ arq --data data.ttl --query query.rq 
------------ 
| parts | 
============ 
| ex:part2 | 
------------ 

鑑於你寫什麼或者你的查詢軟件是越野車(可能),但,更可能的是,您可能在數據或查詢中遇到簡單的錯字。如果(例如)你擁有'擁有'(小寫)而不是'擁有',它會解釋你的結果。

嘗試單獨執行{<Person1> <Owns> ?parts}。你有什麼結果嗎?匹配查詢返回的部分嗎?

+0

非常感謝。我正在使用其中一個使用Jena訪問商店的RDFMS供應商實現RDF。我通過Jena將數據插入到DBMS中,並使用Fuseki在將它們放入Java之前處理SPARQL查詢。我檢查了案件和打字,看起來一切正常。我會再驗證一次,然後給我的供應商代表打個電話。也許他可以幫忙。在打電話給供應商之前,我總是認爲這是我的問題。 – 2013-03-19 16:50:32

+0

我跟供應商談過。這是SPARQL 1.1支持中的一個限制。他們也不會給出這個限制的錯誤。你給了我很好的見解 - 總是試着對抗arq。非常感謝。 – 2013-03-21 14:23:55