SPARQL合并-将两列合并为一列

SPARQL合并-将两列合并为一列,sparql,sparqlwrapper,Sparql,Sparqlwrapper,我是SPARQL的新手,我想将两个列合并为一个 初始表 a|b|1 c|d|2 通缉犯 a|b c|d b|1 d|2 这就像创建两个不同的表并将它们一个放在另一个上 我需要它来使用d3sparql进行可视化,d3sparql采用这种数据形式,我还考虑导入json并修改它,然后将其打印到屏幕上,但如果这是可能的,这会使事情变得更简单、更快 更新: 我最初的查询是这样的 PREFIX prefix1:<...> PREFIX prefix2:<...> SELECT

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

初始表

a|b|1
c|d|2
通缉犯

a|b
c|d
b|1
d|2
这就像创建两个不同的表并将它们一个放在另一个上

我需要它来使用d3sparql进行可视化,d3sparql采用这种数据形式,我还考虑导入json并修改它,然后将其打印到屏幕上,但如果这是可能的,这会使事情变得更简单、更快


更新: 我最初的查询是这样的

PREFIX prefix1:<...>
PREFIX prefix2:<...>
SELECT ?x ?y ?z 
WHERE  { 
?x prefix1:OwnsY ?y.
?y prefix1:PublishesZ ?z.
}
前缀前缀x1:
前缀前缀x2:
选择?x?y?z
何处{
?x前缀x1:OwnsY?y。
y前缀x1: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:>

现在,如果您希望获得那些没有相应的发布和拥有三元组的拥有和发布三元组,则可以使用并集、值块或属性路径。工会将是

{ ?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”,即使没有f发布的内容,也没有g拥有的内容。您的原始查询将找不到这些。如果需要排除没有“发布”和“自己”对应项的“拥有”和“发布”三元组,则需要使用union选项,该选项包括中的所有部分。

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

前缀前缀x1:
前缀前缀x2:
选择不同的?x?z
在哪里{
{?x prefix1:OwnsY?y.?y prefix1:PublishesZ?z.}
联合
{?x prefix1:OwnsY?z.?z prefix1:PublishesZ?随便什么。}
}

实际上,它会执行两次查询。

您最初的查询是什么?我认为您只需要将原始数据拆分为一个联合体,但当您这样呈现时,这有点难以帮助。刚刚更新了问题,谢谢您的帮助:)@ozama您的数据集是否包含其他组件不存在的所有者或发布者的任何用途?也就是说,你只想选择所有的拥有和发布三元组,还是当它们之间有一个共同的y时,你只想要?x和?z?@Joshua是的,先生,我想要实现的是所有的拥有和发布都在一个原始中,@ozama所以如果“a拥有b”,但没有c使得“b拥有c”,你仍然希望输出中有“a b”?如果是这样的话,那么您的查询实际上并没有实现这一点,但是您可以在中使用这种方法。请务必阅读评论以了解这两种方法之间的区别。这是不等价的。该查询要求x拥有y,y发布z,而您使用了or;这将获取未发布任何内容的已发布内容,以及未发布的已发布内容。@user205512我已更新我的答案,使其明确;这只适用于提取两种类型的三元组,而不是提取更复杂的结构。我认为我几乎可以做到这一点,而不需要知道原始查询——您应该能够获取子选择的结果,进行叉积以将行加倍,并相应地进行投影/绑定。疯狂,虽然:-)这将获得原始查询检索到的结果,但是基于,听起来原始查询实际上可能限制太多。
?x :owns|:publishes ?y
-----------
| x  | y  |
===========
| :a | :b |
| :b | 1  |
| :c | :d |
| :d | 2  |
| :e | :f | * owns
| :g | :h | * publishes
-----------
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. }
}