问题: 我想使用cypher返回可以指定起点的路径,并按进入这些路径的终点的连接数进行过滤。
一些虚拟示例数据:
路径1:(a1:a)-(b1:b)-(c1:c)-(d1:d)
路径2:(a1:a)-(b2:b)-(c2:c)-(d1:d)
路径3:(a1:a)-(b3:b)-(c3:c)-(d2:d)
路径4:(a1:a)-(b2:b)-(c2:c)-(d3:d)
路径5:(a2:a)-(b4:b)-(c4:c)-(d3:d)
目标: 我想带回所有以a1开始并以dn结尾的路径,其中从a1开始的路径与dn的关系计数> 1(或2或3)。在上面的示例中,我们将使用> 1但是我希望能够针对关系计数可能更高的真实数据进行更改。
在上面的示例中,我想包括路径1和路径2,因为它们都以a1开头并在d1处终止,并且从a1开始并在d1处终止的路径数为2(即> 1)。>
路径3和4将被排除,因为尽管它们以a1开头,但是没有其他以a1开头的路径以d2或d3结尾。换句话说,d2和d3在以a1开头的路径的上下文中是唯一的。
路径5将被排除,因为它不是以a1开头,即使有> 1条路径以d3结尾
除了能够在查询过程中指定其标签并最终获得返回路径的节点之外,所有中间节点基本上都不相关。
我已经看过了,但是在其他地方找不到解决这个问题的任何东西
答案 0 :(得分:1)
为便于进一步解答和解决方案,我注意到了我的图形创建语句:
CREATE
(a1:LabelA {name: 'A1'})-[:BELONGS_TO]->(b1:LabelB {name: 'B1'})-[:BELONGS_TO]->(c1:LabelC {name: 'C1'})
-[:BELONGS_TO]->(d1:LabelD {name: 'D1'}),
(a1)-[:BELONGS_TO]->(b2:LabelB {name: 'B2'})-[:BELONGS_TO]->(c2:LabelC {name: 'C2'})-[:BELONGS_TO]->(d1),
(a1)-[:BELONGS_TO]->(b3:LabelB {name: 'B3'})-[:BELONGS_TO]->(c3:LabelC {name: 'C3'})
-[:BELONGS_TO]->(d2:LabelD {name: 'D2'}),
(c2)-[:BELONGS_TO]->(d3:LabelD {name: 'D3'}),
(a2:LabelA {name: 'A2'})-[:BELONGS_TO]->(b4:LabelB {name: 'B4'})-[:BELONGS_TO]->(c4:LabelC {name: 'C4'})
-[:BELONGS_TO]->(d3);
MATCH path = (:LabelA {name:'A1'})-[:BELONGS_TO*]->(endNode:LabelD)
WITH endNode, count(endNode) AS endNodeAmount WHERE endNodeAmount > 1
RETURN endNode.name AS endNode, endNodeAmount;
$relationshipAmount
代替╒═════════╤═══════════════╕
│"endNode"│"endNodeAmount"│
╞═════════╪═══════════════╡
│"D1" │2 │
└─────────┴───────────────┘
如果您对节点A1和标识的Dx之间的路径感兴趣,则可以依赖以下Cypher查询。
MATCH path = (startNode:LabelA {name:'A1'})-[:BELONGS_TO*]->(endNode:LabelD)
WITH collect(path) as paths, endNode WHERE size(paths) > 1
UNWIND paths as path RETURN path;
(鞠躬致谢@InverseFalcon的优化思想。)
╒═══════════════════════════════════════════════╕
│"path" │
╞═══════════════════════════════════════════════╡
│[{"name":"A1"},{},{"name":"B1"},{"name":"B1"},{│
│},{"name":"C1"},{"name":"C1"},{},{"name":"D1"}]│
├───────────────────────────────────────────────┤
│[{"name":"A1"},{},{"name":"B2"},{"name":"B2"},{│
│},{"name":"C2"},{"name":"C2"},{},{"name":"D1"}]│
└───────────────────────────────────────────────┘