您可以使用非常简单的查询来获取每个顶点的度数?x
:
select ?x (count(*) as ?degree) {
{ ?x ?p ?o } union
{ ?s ?p ?x }
}
group by ?x
例如,对于这个数据:
@prefix : <https://stackoverflow.com/q/24270532/1281433/> .
# a
# |
# V
# b<--c-->d
# |
# V
# e
:a :p :c .
:c :p :b, :d, :e .
你会得到结果:
---------------
| x | degree |
===============
| :a | 1 |
| :b | 1 |
| :c | 4 |
| :d | 1 |
| :e | 1 |
---------------
现在,如果您想要最大的一个,您可以简单地订购并使用限制 1,例如,
select ?x (count(*) as ?degree) {
{ ?x ?p ?o } union
{ ?s ?p ?x }
}
group by ?x
order by desc(?degree)
limit 1
---------------
| x | degree |
===============
| :c | 4 |
---------------
如果只有一个具有最高度数的顶点,这将起作用。如果有多个具有相同最高学位的,您将只获得其中之一。
如果你真的想combine你有两个查询,然后是这样的罗布·霍尔的回答 https://stackoverflow.com/a/24271282/1281433将工作,except由于子查询不返回入度为 0 或出度为 0 的节点,因此它们不会出现在最终结果中,因为它们不可连接。因此,只有在保证每个节点都有非零入度和出度时才使用该方法。他的答案对于如何构建图表并以编程方式使用 Jena 运行这些查询的示例也很有用。