1

我是 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.
}
4

2 回答 2

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

这实际上执行了两次查询。

于 2015-03-09T15:02:43.887 回答
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 |
---------------

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

{ ?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 的答案中的所有部分。

于 2015-03-09T15:01:47.523 回答