如何通过Cypher按路径两端A节点分数总和排序路径?
问题描述
我的图结构如下:
(a1:A {name:'a1', s:1}) -> -> (a3:A {name:'a3',s:11}) (a2:A {name:'a2', s:10}) -> (b1:B) -> (c1:C) -> (b2:B) -> (a4:A {name:'a4',s:123})
左侧有2个A类型节点连接至同一个左侧B类型节点,右侧有2个A类型节点连接至另一个右侧B类型节点。每个A类型节点拥有表示分数的属性s。
执行以下查询:
match p=((a1:A)--(b1:B)--(:C)--(b2:B)--(a2:A)) where a1.name in ['a1', 'a2'] return p
会得到4条无排序的路径,但我希望按路径两端A类型节点的分数总和排序,最终得到如下顺序的路径:
(:A {name:'a2', s:10}) -> (b1:B) -> (c1:C) -> (b2:B) -> (:A {name:'a4',s:123}) (:A {name:'a1', s:1}) -> (b1:B) -> (c1:C) -> (b2:B) -> (:A {name:'a4',s:123}) (:A {name:'a2', s:10}) -> (b1:B) -> (c1:C) -> (b2:B) -> (:A {name:'a3',s:11}) (:A {name:'a1', s:1}) -> (b1:B) -> (c1:C) -> (b2:B) -> (:A {name:'a3',s:11})
请问能否通过Cypher实现该需求?
解决方案
完全可以实现,只需要在查询中计算两端A节点的分数总和,再按这个总和降序排序即可(你期望的顺序对应总和从大到小:10+123=133、1+123=124、10+11=21、1+11=12)。
修改后的Cypher语句如下:
MATCH p=((a1:A)--(b1:B)--(:C)--(b2:B)--(a2:A)) WHERE a1.name IN ['a1', 'a2'] WITH p, a1.s + a2.s AS totalScore RETURN p ORDER BY totalScore DESC, a1.s DESC
说明:
WITH p, a1.s + a2.s AS totalScore:计算每条路径两端A节点的分数总和,并命名为totalScoreORDER BY totalScore DESC:先按总和降序排列,确保总和大的路径排在前面- 额外加上
a1.s DESC是为了在总和相同时(比如前两条都包含a4的情况),让s值大的a2排在a1前面,完全匹配你期望的顺序
内容的提问来源于stack exchange,提问作者drdot
相关产品推荐
相关产品推荐

