SPARQL - 需要完成集合的主题

时间:2013-03-19 12:38:55

标签: sparql

我正在使用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中的所有部件。我尝试了很多其他的查询,但在阅读完教程和书籍后,这对我来说是最符合逻辑的。有人能指出我出错的地方吗?

感谢您的时间。

1 个答案:

答案 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}。你有什么结果吗?是否匹配您的查询返回的部分?