Cypher / neo4j返回的路径具有相同的起点和终点,终点按路径数过滤

时间:2018-11-28 12:47:38

标签: neo4j cypher

问题: 我想使用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结尾

除了能够在查询过程中指定其标签并最终获得返回路径的节点之外,所有中间节点基本上都不相关。

我已经看过了,但是在其他地方找不到解决这个问题的任何东西

1 个答案:

答案 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);

Graph

解决方案

MATCH path = (:LabelA {name:'A1'})-[:BELONGS_TO*]->(endNode:LabelD) 
WITH endNode, count(endNode) AS endNodeAmount WHERE endNodeAmount > 1 
RETURN endNode.name AS endNode, endNodeAmount;

基本思想

  • 第一行:定义任意长度的A1到Dn路径的模式
  • 第二行:计算每个endNode(Dn)的出现次数并对其进行过滤,图1可以用参数$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"}]│
└───────────────────────────────────────────────┘

Graph 2