neo4j indegree outdegree union

时间:2017-03-11 06:20:45

标签: neo4j

我想计算Indegree和Outdegree并返回一个图形,该图形在前5个Indegree节点和前5个Outdegree节点之间有连接。我写了一个代码

match (a:Port1)<-[r]-()
return a.id as NodeIn, count(r) as Indegree
order by Indegree DESC LIMIT 5
union
match (n:Port1)-[r]->()
return n.id as NodeOut, count(r) as Outdegree
order by Outdegree DESC LIMIT 5
union
match p=(u:Port1)-[:LinkTo*1..]->(t:Port1)
where u.id in NodeIn and t.id in NodeOut 
return p

我收到错误

  

UNION中的所有子查询必须具有相同的列名(第4行,第1列(偏移量:99))&#34; union&#34;

我需要对代码进行哪些更改?

1 个答案:

答案 0 :(得分:0)

我们可以改进一些事情。

您正在进行的匹配并不是获得关系传入和传出度数的最有效方法。

此外,UNION只能用于将查询结果与相同的列组合在一起。在这种情况下,我们甚至不需要UNION,我们可以使用WITH将查询的一部分的结果传递给另一部分,并使用COLLECT()管理您需要的节点。

尝试此查询:

match (a:Port1)
with a, size((a)<--()) as Indegree
order by Indegree DESC LIMIT 5

with collect(a) as NodesIn
match (a:Port1)
with NodesIn, a, size((a)-->()) as Outdegree
order by Outdegree DESC LIMIT 5

with NodesIn, collect(a) as NodesOut
unwind NodesIn as NodeIn
unwind NodesOut as NodeOut
// we now have a cartesian product between both lists
match p=(NodeIn)-[:LinkTo*1..]->(NodeOut)
return p

请注意,这会执行两个NodeLabelScans:Port1节点,并且每个节点的前5个交叉产品,因此有25个可变长度路径匹配,可以是费用,因为这会从每个NodeIn生成所有可能的路径到每个NodeOut。

如果你只有一个是每个之间最短的连接,那么你可以尝试用shortestPath()调用替换你的变量长度匹配,这只返回在每两个节点之间找到的最短路径:

...
match p = shortestPath((NodeIn)-[:LinkTo*1..]->(NodeOut))
return p

此外,确保您所需的方向正确,因为您匹配度数最高的节点并获得具有最高出度的节点的传出路径,这似乎可能是向后退我,但您知道你的要求最好。