sparql:如何避免访问主题

时间:2018-10-04 01:16:53

标签: 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”也为空。

1 个答案:

答案 0 :(得分:2)

这里有几件事要解决:

  

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

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

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

这会将?a绑定到rdf:type,并将?b绑定到1-34414203048。查询模式的第二部分是:

?b ?c ?d .

由于?b已被先前的模式绑定到1-34414203048,因此?chasTenureInOrganization)和?d({{1 }})。然后查询的第三位是:

1-36436064275

?d ?e ?n . 已被先前的模式绑定,因此?d(再次为?e)和rdf:type(再次为?n)具有一个选项。 / p>

  

我想跳过访问的主题,因此“?d”为空,因此“?n”为   也空着。

这不是SPARQL的工作方式。仅当 entire 模式产生结果时,SPARQL才返回查询结果。如果1-36436064275没有值,查询将返回空结果。

话虽如此,如果您想确保?n永远不等于开始查询的主题,则可以简单地添加FILTER条件:

?d

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