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