Rdf 如何提取在图形中同时作为主体和对象出现的节点?

Rdf 如何提取在图形中同时作为主体和对象出现的节点?,rdf,sparql,Rdf,Sparql,我想检索一个节点列表(图中的顶点),这些节点同时出现在三元组(不一定是同一个三元组)的主体和对象部分 我尝试使用如下子查询进行此操作: SELECT ?x { ?x ?p ?o. { SELECT ?x WHERE { ?s ?p ?x . } } } 它没有给我确切的结果,因为我得到了节点实例的多个实例。当我尝试使用DISTINCT时,出于某种原因,它给出了更多的实例 另一方面,如果我想提取作为主体或对象的节点,我应该怎么做呢 如果所

我想检索一个节点列表(图中的顶点),这些节点同时出现在三元组(不一定是同一个三元组)的主体和对象部分

我尝试使用如下子查询进行此操作:

SELECT ?x
{

       ?x ?p ?o.

     {
         SELECT ?x  WHERE { ?s ?p ?x . }
     }
}
它没有给我确切的结果,因为我得到了节点实例的多个实例。当我尝试使用DISTINCT时,出于某种原因,它给出了更多的实例

另一方面,如果我想提取作为主体或对象的节点,我应该怎么做呢

如果所用词汇有错误,请原谅

作为主体和对象的节点 短而甜 只要要求一些东西作为主语和宾语出现:

select distinct ?x {
  ?s1 ?p1  ?x .
   ?x ?p2 ?o2 .
}
使其难以辨认(只是为了好玩) 如果您想让它稍微短一点,但可读性要差得多,您可以使用

prefix : <...anything...>

select distinct ?x {
  ?x (:|!:) ?o ; ^(:|!:) ?s .
}
删除注释和换行符后,我们将获得

?x (:|!:) ?o ; ^(:|!:) ?s .
您可能应该使用可读的

作为主体或对象的节点 这已经在您之前关于计算节点度的问题中得到了回答。那里的答案使用此查询来计算度:

select ?x (count(*) as ?degree) { 
  { ?x ?p ?o } union
  { ?s ?p ?x }
}
group by ?x
不过,它也可以找到作为主体或对象的节点。只需将其更改为:

select distinct ?x  { 
  { ?x ?p ?o } union
  { ?s ?p ?x }
}
或者,您也可以在此处使用通配符方法:

select distinct ?x {
  ?x (:|!:)|^(:|!:) [].
}

你能解释一下为什么选择distinct?x{s1?p1?x。?x?p1?o1.}不会产生我想要的结果吗?和往常一样,你的答案是正确的!谢谢:)您使用了两次
?p1
,这意味着您只计算属于同一属性的主题和对象的
?x
。它不允许您匹配,例如,
:a
等数据中的
:a:p:b.:c:q:a
<代码>:a是其中的主语和宾语,但属性不同。
select distinct ?x {
  ?x (:|!:)|^(:|!:) [].
}