我正在使用 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 中的所有零件。我尝试了很多其他查询,但在阅读教程和书籍后,这对我来说是最合乎逻辑的。有人可以指出我哪里出错了吗?
感谢您的宝贵时间。
最佳答案
您使用的是什么查询软件,您的数据实际上是什么样的?我使用 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}
通过它自己。你有结果吗?与您的查询返回的部分是否匹配?
关于SPARQL - 完成该组所需的主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15499759/