SPARQL combine - 将两列连接成一列

SPARQL combine - concatenate two columns into one

我是 SPARQL 的新手,我想将两列合并为一列

初始table

a|b|1
c|d|2

想要table

a|b
c|d
b|1
d|2

这就像创建两个不同的 table 并将它们放在另一个上。

我需要它来使用采用这种数据形式的 d3sparql 进行可视化,我还考虑过导入 json 并修改它然后将其打印到屏幕上,但如果这可能的话更容易和更快..


更新: 我的原始查询看起来像那样

PREFIX prefix1:<...>
PREFIX prefix2:<...>
SELECT ?x ?y ?z 
WHERE  { 
?x prefix1:OwnsY ?y.
?y prefix1:PublishesZ ?z.
}

如果您只是想提取拥有的和已发布的三元组的所有主语和宾语,那么这可能是一个非常简单的查询。另一方面,如果您只需要包含所有三个部分的数据,则需要一个完整的联合。让我们创建一些示例数据,看看我们能做什么:

@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 ?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 owns f" 和 "g publishes h",即使 f 没有发布任何内容,也没有任何内容拥有 g。您的原始查询不会找到这些。如果您需要排除没有发布和自己对应的拥有和发布三元组,则需要使用 union 选项,它包括 .

中的所有部分

最简单(但不是最有效)的方法是:

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

实际上执行了两次查询。