2

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

谢谢你的时间。

4

1 回答 1

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 |
------------

鉴于您编写的查询软件有错误(可能),但更有可能的是,您的数据或查询中可能有一个简单的拼写错误。如果(例如)你有'owns'(小写)而不是'Owns',它会解释你的结果。

尝试{<Person1> <Owns> ?parts}自行执行。你有任何结果吗?是否与您的查询返回的部分匹配?

于 2013-03-19T16:04:23.220 回答