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

use*_*166 4 rdf sparql

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

我尝试使用子查询,如下所示:

SELECT ?x
{

       ?x ?p ?o.

     {
         SELECT ?x  WHERE { ?s ?p ?x . }
     }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jos*_*lor 7

作为主体和对象的节点

简短又甜蜜

只要问一些看似主题和对象的东西:

select distinct ?x {
  ?s1 ?p1  ?x .
   ?x ?p2 ?o2 .
}
Run Code Online (Sandbox Code Playgroud)

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

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

prefix : <...anything...>

select distinct ?x {
  ?x (:|!:) ?o ; ^(:|!:) ?s .
}
Run Code Online (Sandbox Code Playgroud)

该模式(:|!:)匹配任何属性:或不属性:.这意味着它匹配一切; 这只是一张通配符.(你可以只使用?p这基本上是一个通配符,太多,但请继续阅读...)的路径^p表示P,但在相反方向上(因此,例如,?person foaf:name ?name?name ^foaf:name ?person匹配相同的数据.由于(:|!:)是通配符,^(:|!:)在反向通配符我们不能在属性路径中使用变量,因此即使?p是"前向通配符",我们也不能将其^?p用作"后向通配符".;符号只是让你缩写,例如?x :p2 :o1?x :p2 :o2as ?x :p1 :o1 ; :p2 :o2.在这里使用它,我们可以得到:

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

删除评论和换行符,我们得到

?x (:|!:) ?o ; ^(:|!:) ?s .
Run Code Online (Sandbox Code Playgroud)

您应该使用可读的.:)

作为主体或对象的节点

您之前关于计算节点度的问题已经回答了这个问题,如何使用SPARQL计算有向图的最大度数?.那里的答案用这个查询来计算学位:

select ?x (count(*) as ?degree) { 
  { ?x ?p ?o } union
  { ?s ?p ?x }
}
group by ?x
Run Code Online (Sandbox Code Playgroud)

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

select distinct ?x  { 
  { ?x ?p ?o } union
  { ?s ?p ?x }
}
Run Code Online (Sandbox Code Playgroud)

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

select distinct ?x {
  ?x (:|!:)|^(:|!:) [].
}
Run Code Online (Sandbox Code Playgroud)

  • 你两次使用`?p1`,这意味着你只计算那些作为同一属性的主体和对象的`?x`.它不会让你匹配,例如`:a`在像`:a:p:b这样的数据中.:c:q:a`.`:a`是一个主题和对象,但没有相同的属性. (2认同)