gpt4 book ai didi

SPARQL:选择第 n 个空白节点

转载 作者:行者123 更新时间:2023-12-02 07:12:20 26 4
gpt4 key购买 nike

如下图所示:

:Foo :p _:b0 ;
:p _:b1 ;
:p _:b2 .

_:b0 :p1 :apple ;
:p2 :banana .

_:b1 :p3 :cantaloupe ;
:p4 :date ;
:p5 :elderberry .

_:b2 :p6 :fig .

注意: :Foo 是具有相同谓词 :p 的三个三元组的主语。每个三元组都有一个空白节点作为其对象。

<小时/>

是否可以编写一个 SPARQL 查询来选择仅 _:b1 为主题的所有三元组?

<小时/>

编辑:在提出答案之前,请理解我正在 SPARQL 中为我的问题寻找一个聪明的解决方案。假设三元组存储是固定的(即:无法更改数据)。我上面展示的图表是人为设计的;每个空白节点没有相同数量的 p/o 三元组。然而,如果它们每个都有一个三元组,那么以下 SPARQL 查询可能就足够了:

select ?b1 where {
:Foo :p ?bn .
?bn ?p ?o
} limit 1 offset 1

显然,这里关心的是每次返回相同的空白节点。我知道它是一个集合并且本质上是无序的,因此不能保证可重复的结果排序;但老实说......对于固定三重存储,我真诚地怀疑 DFA 会在查询之间返回不同的空白节点排序。有什么巧妙的想法吗?

最佳答案

您无法在 SPARQL 中选择“第 n”个空白节点,原因有两个:

  1. RDF 模型是一个集合:三元组是无序的。
  2. 空白节点表示没有标识符的资源 - 这意味着它无法(直接)寻址/识别。

在 RDF/SPARQL 中,您以间接的方式使用空白节点:而不是尝试直接寻址它们(正如我们在上面看到的,这是不可能的,因为空白节点的定义是它没有标识符),您可以查看将它们连接到其他资源的事物,即它们所涉及的语句。毕竟,这些语句赋予了空白节点其上下文含义。

在您的情况下:_:b1 和其他两个空白节点之间的差异在于它们扮演主语角色的语句。因此,要在 SPARQL 中查询以 _:b1 为主题的三元组,您应该查看数据并发现 _:b1 唯一具有属性 :p3 值为 :cantaloupe。所以你可以像这样查询:

   CONSTRUCT { ?s ?p ?o }
WHERE { :Foo :p ?s .
?s :p3 :cantaloupe ;
?p ?o .
}

旁注:一些 SPARQL 引擎实现提供了一些功能来解决没有(全局)标识符的空白节点的问题。在许多情况下,它们引入了一些非标准语法扩展或自定义函数,允许您直接寻址 SPARQL 查询中的空白节点。我想强调的是,这是非标准的,不太可能跨不同端点工作,因此最好避免。

如果您发现如果不以某种方式直接寻址空白节点,您确实无法工作,那么您应该考虑在数据中根本不使用空白节点,而是为这些东西创建适当的 IRI。

更新您对问题的更新基本上问的是:“我可以在 SPARQL 的未命名特定实现中使用一些未记录的功能来执行查询,严格来说,这是不合法的,或者不能保证给出我想要的结果,然后就侥幸逃脱?”这个问题的答案是:可能是的,但这取决于您使用的 SPARQL 实现,并且由于我上面给您提供的所有原因,这是一个非常糟糕的想法

在实践中,许多(大多数?)三重存储确实会在查询之间以相同的顺序返回相同的结果,尽管这并不能保证(我不能充分强调这一点),你真的应该不要依赖它。当然,您可以通过在查询中使用 ORDER BY 子句来获得有序查询结果,但这在这种情况下没有帮助,因为空白节点的相对顺序在 SPARQL 中未定义(因此查询引擎可以按其认为合适的任何顺序返回 _:b1_:b2,即使存在 ORDER BY 子句) 。更糟糕的是:虽然您的输入 RDF 文件可能包含空白节点标识符 _:b1_:b2,但这不一定是 SPARQL 查询返回的内容。许多三元组存储用内部生成的 id 替换空白节点标识符,并且您的 SPARQL 查询很可能返回 _:genid-908c909aeacc4b6da3d3059e18706d68-b1 而不是简单的 _:b1

即使你能以某种方式可靠地取回空白节点 ID:你打算用它做什么?空白节点是空白的。它携带的 id 仅用于内部记账目的 - 您不能使用空白节点来进一步查询任何内容。

相信我:这是一个坏主意。如果无法更改数据,请依赖连接空白节点的属性并查询这些数据。

关于SPARQL:选择第 n 个空白节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32855380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com