SPARQL:如何避免访问主题



我正在尝试编写SPARQL查询来查找不同的对象。

这是数据集:

<https://permid.org/1-36436064275> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://permid.org/1-34414203048> .
<https://permid.org/1-34414203048> <http://permid.org/ontology/person/hasTenureInOrganization> <https://permid.org/1-36436064275> .

我的 Sparql 查询是这样的:

select distinct ?n where {
<https://permid.org/1-36436064275> ?a ?b .
?b ?c ?d . 
?d ?e ?n .                     
}

从数据集中,"?d"是 https://permid.org/1-36436064275,这是访问的主题。我想跳过访问过的主题,以便"?d"为空,因此"?n"也是空的。

这里有几件事需要解决:

从数据集中,"?d"是 https://permid.org/1-36436064275,这是访问的主题。

发生这种情况是因为你的RDF图是一个循环。SPARQL 查询的第一部分是:

<https://permid.org/1-36436064275> ?a ?b .

这绑定了?ardf:type?b绑定到1-34414203048。查询模式的第二部分是:

?b ?c ?d .

由于?b已经绑定到1-34414203048的模式,因此?c(hasTenureInOrganization(和?d(1-36436064275(只有一个选项。然后查询的第三位是:

?d ?e ?n . 

?d已经受先前模式的约束,因此?e(再次rdf:type(和?n(再次1-36436064275(有一个选项。

我想跳过访问过的主题,因此"?d"为空,因此"?n"是 也是空的。

这不是SPARQL的工作方式。SPARQL 仅在整个模式都有结果时才返回查询结果。如果?n没有值,则查询将返回空结果。

话虽如此,如果要确保?d永远不会等于开始查询的主题,只需添加一个 FILTER 条件:

FILTER (?d != <https://permid.org/1-36436064275>)

但是,就像我在评论中所说的那样,我认为您可能需要重新考虑您的数据模型,并考虑查询的目的。

最新更新