我正在使用RDF开发一个新项目,只是学习它和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}
}
我的想法是获取属于Product1的所有部件,然后消除Person1拥有的部件。但我得到了Product1中的所有部件。我尝试了很多其他的查询,但在阅读完教程和书籍后,这对我来说是最符合逻辑的。有人能指出我出错的地方吗?
感谢您的时间。
答案 0 :(得分: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}
。你有什么结果吗?是否匹配您的查询返回的部分?