我想检索在三元组的主题和对象部分中发生的节点列表(图中的顶点)(不一定是相同的三元组)。
我尝试使用子查询执行此操作,如下所示:
SELECT ?x
{
?x ?p ?o.
{
SELECT ?x WHERE { ?s ?p ?x . }
}
}
在我获得节点实例的多个实例的意义上,它没有给我确切的结果。当我尝试DISTINCT时,它出于某种原因提供了更多实例。
另一方面,如果我想提取作为主题OR对象的节点,我该怎么做呢?
如果使用的词汇有任何错误,请原谅。
答案 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