我是SPARQL的新手,我想将两列合并为一个
初始表
a|b|1
c|d|2
通缉表
a|b
c|d
b|1
d|2
就像创建两个不同的表并将它们放在另一个表上一样。
我需要使用d3sparql进行可视化,它采用这种数据形式,我还要导入一个json并修改它然后将其打印到屏幕上,但是如果这可能会使事情变得更容易和更快..
更新: 我的原始查询看起来像那样
PREFIX prefix1:<...>
PREFIX prefix2:<...>
SELECT ?x ?y ?z
WHERE {
?x prefix1:OwnsY ?y.
?y prefix1:PublishesZ ?z.
}
答案 0 :(得分:2)
最简单的方法(但不是最有效的方法)是:
PREFIX prefix1:<...>
PREFIX prefix2:<...>
SELECT DISTINCT ?x ?z
WHERE {
{ ?x prefix1:OwnsY ?y. ?y prefix1:PublishesZ ?z. }
UNION
{ ?x prefix1:OwnsY ?z. ?z prefix1:PublishesZ ?whatever. }
}
实际上执行了两次查询。
答案 1 :(得分:1)
如果你只想提取所有的主题和对象以及已发布的三元组,那么这可能是一个非常简单的查询。另一方面,如果您只想要包含所有三个部分的数据,那么您将需要一个完整的联合。让我们创建一些示例数据,看看我们能做些什么:
@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 |
---------------
现在,如果您愿意获取这些拥有者并发布没有相应发布并拥有三元组的三元组,则可以使用union,values块或属性路径。工会将是
{ ?x :owns ?y } union { ?x :publishes ?y }
值块会更简单一些:
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”,即使没有任何内容可以发布,也没有任何拥有g的内容。您的原始查询将找不到这些。如果您需要排除拥有并发布没有发布和拥有对应项的三元组,则需要使用union选项,其中包括user205512's answer中的所有部分。