我正在尝试编写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 .
这绑定了?a
rdf: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>)
但是,就像我在评论中所说的那样,我认为您可能需要重新考虑您的数据模型,并考虑查询的目的。