我正在尝试编写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”也为空。
答案 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
,因此?c
(hasTenureInOrganization
)和?d
({{1 }})。然后查询的第三位是:
1-36436064275
?d ?e ?n .
已被先前的模式绑定,因此?d
(再次为?e
)和rdf:type
(再次为?n
)具有一个选项。 / p>
我想跳过访问的主题,因此“?d”为空,因此“?n”为 也空着。
这不是SPARQL的工作方式。仅当 entire 模式产生结果时,SPARQL才返回查询结果。如果1-36436064275
没有值,查询将返回空结果。
话虽如此,如果您想确保?n
永远不等于开始查询的主题,则可以简单地添加FILTER条件:
?d
但是,就像我在评论中所说的那样,我认为您可能需要重新考虑一下数据模型,并考虑一下查询的目的。