sparql:如何避免访问主题

sparql:如何避免访问主题,sparql,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/perso

我正在尝试编写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 .                     
}
选择distinct?n其中{
a?b。
b?c?d。
d?e?n。
}

从数据集中,“?d”是,这是访问的主题。我想跳过访问的主题,这样“?d”为空,因此“?n”也为空

这里有几个问题需要解决:

从数据集中,“?d”是,这是访问的主题

这是因为RDF图是一个循环。SPARQL查询的第一位是:

<https://permid.org/1-36436064275> ?a ?b .
?d ?e ?n . 
由于前面的模式已将
?b
绑定到
1-34414203048
,因此
?c
hasTenureInOrganization
)和
?d
1-36436064275
)只有一个选项。然后,查询的第三位是:

<https://permid.org/1-36436064275> ?a ?b .
?d ?e ?n . 
?d
已经被前面的模式绑定,因此有一个选项用于
?e
rdf:type
)和
?n
1-36436064275

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

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

话虽如此,如果您想确保
?d
永远不等于您开始查询时使用的主题,您可以简单地添加一个过滤条件:

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

但是,正如我在评论中所说的,我认为你可能需要重新思考一下你的数据模型,并考虑你的查询的目的。p> 这里有几个问题需要解决:

从数据集中,“?d”是,这是访问的主题

这是因为RDF图是一个循环。SPARQL查询的第一位是:

<https://permid.org/1-36436064275> ?a ?b .
?d ?e ?n . 
由于前面的模式已将
?b
绑定到
1-34414203048
,因此
?c
hasTenureInOrganization
)和
?d
1-36436064275
)只有一个选项。然后,查询的第三位是:

<https://permid.org/1-36436064275> ?a ?b .
?d ?e ?n . 
?d
已经被前面的模式绑定,因此有一个选项用于
?e
rdf:type
)和
?n
1-36436064275

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

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

话虽如此,如果您想确保
?d
永远不等于您开始查询时使用的主题,您可以简单地添加一个过滤条件:

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

但是,正如我在评论中所说的,我认为你可能需要重新思考一下你的数据模型,并考虑你的查询的目的。p> 您的rdf数据看起来很奇怪,您的图表中有一个奇怪的循环:资源a有一个类型B,但B(显然)是一个在组织中有任期的人,这又是一个类型a。那么,如果
1-36436064275
是一个组织,而
1-34414203048
是一个人,那么这个组织怎么可能是一种人呢?这听起来是错误的。还有一个提示:从你如何表达你的问题,我推断你正在把这当作某种图形遍历问题来处理。我建议你不要“仅仅”考虑图表,而是考虑图表中所包含的知识。考虑一下您的查询的目的是什么,根据您试图从数据中获取的知识(例如,检索“有任期的人”而不是“不同的对象”、“访问的节点”和“跟随的边”)。您的rdf数据看起来很奇怪,您的图中有一个奇怪的循环:资源a有一个类型B,但B是(显然)一个在一个组织中有任期的人,又是一个。那么,如果
1-36436064275
是一个组织,而
1-34414203048
是一个人,那么这个组织怎么可能是一种人呢?这听起来是错误的。另外一个提示:从你对问题的措辞来看,我推断你是在把它当作某种图表来处理的通用问题。我建议您不要“仅仅”考虑图表,而是考虑图表中捕获的知识。考虑您的查询目的是什么,即您试图从数据中获取的知识(例如,检索“拥有任期的人”而不是“不同的对象”的查询),“访问的节点”和“跟随的边”)。