我想计算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;
我需要对代码进行哪些更改?
答案 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
此外,确保您所需的方向正确,因为您匹配度数最高的节点并获得具有最高出度的节点的传出路径,这似乎可能是向后退我,但您知道你的要求最好。