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

时间:2014-06-18 14:33:06

标签: rdf sparql

我想检索在三元组的主题和对象部分中发生的节点列表(图中的顶点)(不一定是相同的三元组)。

我尝试使用子查询执行此操作,如下所示:

SELECT ?x
{

       ?x ?p ?o.

     {
         SELECT ?x  WHERE { ?s ?p ?x . }
     }
}

在我获得节点实例的多个实例的意义上,它没有给我确切的结果。当我尝试DISTINCT时,它出于某种原因提供了更多实例。

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

如果使用的词汇有任何错误,请原谅。

1 个答案:

答案 0 :(得分:7)

作为主体和对象的节点

短而甜蜜

只是要求出现作为主题和对象的东西:

select distinct ?x {
  ?s1 ?p1  ?x .
   ?x ?p2 ?o2 .
}

让它难以辨认(只是为了好玩)

如果你想让它更短,但可读性更低,你可以使用类似

的东西
prefix : <...anything...>

select distinct ?x {
  ?x (:|!:) ?o ; ^(:|!:) ?s .
}

模式(:|!:)匹配任何::的属性。这意味着它匹配一切;它只是一个通配符。 (您也可以使用?p本质上也是一个通配符,但请继续阅读...)路径^p表示p,但反方向(例如,?person foaf:name ?name和{ {1}}匹配相同的数据。由于?name ^foaf:name ?person是通配符,(:|!:)是反向的通配符。我们无法在属性路径中使用变量,所以即使{{1我是一个&#34;前向通配符&#34;,我们无法使用^(:|!:)作为&#34;后向通配符&#34;。?p符号只是让你缩写,例如,^?p;?x :p2 :o1。在此处使用,我们可以获得:

?x :p2 :o2

删除评论和换行符,我们

?x :p1 :o1 ; :p2 :o2

您应该使用可读的。 :)

作为主体或对象的节点

您之前关于计算节点度How to calculate maximum degree of a directed graph using SPARQL?的问题已经回答了这个问题。那里的答案用这个查询来计算学位:

?x  (:|!:) ?o ;    # every ?x that is a subject
   ^(:|!:) ?s .    # every ?x that is an object

它也可以找到作为主题或对象的节点。只需将其更改为:

?x (:|!:) ?o ; ^(:|!:) ?s .

或者,你也可以在这里使用通配符方法:

select ?x (count(*) as ?degree) { 
  { ?x ?p ?o } union
  { ?s ?p ?x }
}
group by ?x