如果您只是想提取所有的主题和对象,拥有和发布的三元组,那么这可能是一个非常简单的查询。另一方面,如果您只需要包含所有三个部分的数据,则需要一个完整的联合。让我们创建一些示例数据,看看我们能做什么:
@prefix : <urn:ex:>
:a :owns :b .
:b :publishes 1 .
:c :owns :d .
:d :publishes 2 .
:e :owns :f . # no corresponding :publishes
:g :publishes :h . # no corresponding :ownsprefix : <urn:ex:>
这是您当前的查询和结果:
select ?x ?y ?z {
?x :owns ?y .
?y :publishes ?z .
}
---------------
| x | y | z |
===============
| :a | :b | 1 |
| :c | :d | 2 |
---------------
现在,如果您愿意获得那些没有相应发布和拥有三元组的拥有和发布三元组,您可以使用联合、值块或属性路径。工会将是
{ ?x :owns ?y } union { ?x :publishes ?y }
values 块会更简单一些:
values ?p { :owns :publishes }
?x ?p ?y
您可以使用属性路径使其更简单:
?x :owns|:publishes ?y
这些都给你:
-----------
| x | y |
===========
| :a | :b |
| :b | 1 |
| :c | :d |
| :d | 2 |
| :e | :f | * owns
| :g | :h | * publishes
-----------
请注意,出现带有星号的行是因为“e 拥有 f”并且“g 发布了 h”,即使 f 没有发布任何内容,也没有任何内容拥有 g。您的原始查询不会找到这些。如果您需要排除没有发布和拥有对应项的拥有和发布三元组,则需要使用联合选项,其中包括user205512 的答案中的所有部分。