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

Cypher/neo4j返回路径,具有共同的起点和终点,终点按路径数过滤,neo4j,cypher,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) 目标: 我想返回所有以a

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

所有中间节点基本上都是不相关的,除了能够在查询过程中指定它们的标签,并在末尾获得组成路径的节点之外

我已经查看了,但在其他地方找不到任何解决此问题的方法

您的图表 为了便于进一步回答和解决问题,我注意到我的图表创建声明:

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

解决方案 基本思想
  • 第一行:定义任意长度的A1到Dn路径的模式
  • 第二行:计算每个endNode(Dn)的发生量并对其进行筛选,图1可替换为参数
    $relationshipAmount
  • 第三行:展示调查结果
结果

扩展:变量“路径” 解决方案 如果您对节点A1和标识的Dx之间的路径感兴趣,可以依赖以下密码查询

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的优化思想。)

结果

完美!正是我想要的,谢谢!这是最后一种获取过滤器结果并将其应用于获取我完全困惑的路径的方法。谢谢您可以按结束节点收集路径,并按每个结束节点的路径数进行过滤,以避免再次与路径匹配。然后,您只需要解开过滤器中幸存的路径:
。。。使用collect(path)作为路径,endNode其中size(path)>1个展开路径作为路径返回路径
@InverseFalcon宝贵提示!我相应地更新了答案的扩展部分。@neo4j.com你能给我发封电子邮件到michael吗?谢谢。
╒═════════╤═══════════════╕
│"endNode"│"endNodeAmount"│
╞═════════╪═══════════════╡
│"D1"     │2              │
└─────────┴───────────────┘
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;
╒═══════════════════════════════════════════════╕
│"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"}]│
└───────────────────────────────────────────────┘