我有以下数据:
@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
,但仍然会返回6个结果。我尝试按?o
进行分组,但 Blazegraph 会返回错误,说它是一个错误的聚合。为什么重复元组的这种输出会发生?以及如何避免它?
答案 0 :(得分:2)
问题是您已多次插入包含空白节点的数据。此操作不是幂等的。
有用的引语
来自RDF 1.1 Concepts and Abstract Syntax:
空节点标识符是在某些具体RDF语法或RDF存储实现中使用的本地标识符。它们始终本地作用于文件或RDF存储,并且不是空节点的持久性或可移植标识符。
RDF图可以被视为一阶逻辑中简单原子句的连接,其中空节点是被理解为存在的自由变量。在这种语法中,将两个图的并集类似于句法连接。 RDF语法没有明确的变量绑定量词,因此任何RDF图的真值条件都将该图中的自由变量视为该图中的存在量化。采用共享空白节点的图形的并集会改变隐含的量词范围。
空白节点标签的范围限定为结果集。
结果集中的标签
_:a
与数据图中具有相同标签的空白节点之间不需要任何关系。应用程序编写者不应期望查询中的空白节点标签引用数据中的特定空白节点。
假设空白节点...与图形存储中的空白节点不相交,即将插入“新鲜”空白节点。
一些讨论
不同的三重商店为所描述的“问题”提供解决方案。例如,Jena allows使用像<_:b1>
等伪URI。