2

我有以下数据:

@prefix f: <http://example.org#> .

_:a f:trait "Rude"@en .
_:a f:name "John" .
_:a f:surname "Roy" .
_:b f:trait "Crude"@en .
_:b f:name "Mary" .
_:b f:surname "Lestern" .

但是,如果我在Blazegraph中执行以下查询:

PREFIX f: <http://example.org#>

SELECT ?s ?o
WHERE
{
    ?s f:trait ?o .
}

我得到六个结果:

s   o
t32 Crude
t37 Crude
t39 Crude
t31 Rude
t36 Rude
t38 Rude

如果空白节点_:a_:b是不同的节点,我应该如何编写一个 SPARQL 查询以仅返回两个不同的结果?我试过SELECT DISTINCT了,但它仍然返回六个结果。我试过按 分组?o,但Blazegraph返回一个错误,说它是一个糟糕的聚合。为什么会出现这种重复元组的输出?以及如何避免?

4

1 回答 1

3

问题是您已多次插入包含空白节点的数据。此操作不是幂等的。

有用的报价

RDF 1.1 概念和抽象语法

空白节点标识符是在一些具体的 RDF 语法或 RDF 存储实现中使用的本地标识符。它们总是在本地限定为文件或 RDF 存储,并且不是空白节点的持久或可移植标识符。

RDF 1.1 语义

RDF 图可以看作是一阶逻辑中简单原子语句的连词,其中空白节点是被理解为存在的自由变量。取两个图的并集类似于此句法中的句法连接。RDF 语法没有明确的变量绑定量词,因此任何 RDF 图的真值条件都将该图中的自由变量视为该图中的存在量化。采用共享一个空白节点的图的并集会改变隐含的量词范围。

SPARQL 1.1 查询语言

空白节点标签的范围仅限于结果集。

_:a结果集中的标签与数据图中具有相同标签的空白节点之间不需要任何关系。

应用程序编写者不应期望查询中的空白节点标签引用数据中的特定空白节点。

SPARQL 1.1 更新

假设空白节点...与图形存储中的空白节点不相交,即,将插入“新”空白节点。

一些讨论

不同的三元存储为所描述的“问题”提供了解决方案。例如,Jena允许<_:b1>使用诸如etc之类的伪 URI 。

于 2017-06-12T11:12:57.757 回答