2013-03-19 52 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