通过Cypher通过图的所有有效路径

时间:2018-12-17 12:30:14

标签: neo4j cypher neo4j-apoc

我正在尝试编写一个查询,我怀疑这很简单,但是找不到正确的方法。我在Neo4J图形模型中有组织结构数据。它由org_unit节点(团队)和BELONGS_TO关系组成。每个关系都有开始和结束日期,以定义该关系的有效期。我想根据日期返回通过图表的所有有效路径。路径可以具有不同的长度

这似乎需要过滤关系,以便“较高”的关系适合“较低”关系的有效期(我是从下往上)。以下是达到结果的某种方法:

MATCH (a:Org_unit)-[r1:BELONGS_TO]->(b:Org_unit)
MATCH (c:Org_unit)-[r2:BELONGS_TO]->(d:Org_unit)
WHERE r1.endda_epoch > r2.begda_epoch 
AND r1.begda_epoch <= r2.endda_epoch 
AND b=c
RETURN a,b,c,d

但是,我真的很想返回所有完整的路径。我以为我可以使用apoc.path.expand函数之一,但我想我需要根据属性过滤关系-我看不到该怎么做

谢谢

亚当

1 个答案:

答案 0 :(得分:0)

示例数据

为便于进一步解答和解决方案,我注意到了我的图形创建语句:

CREATE
  (a:OrgUnit {name: 'A'})
    <-[:BELONGS_TO {beginDate: date('2019-01-01'), endDate: date('2019-12-31')}]-(b1:OrgUnit {name: 'B1'}),
  (a)<-[:BELONGS_TO {beginDate: date('2000-01-01'), endDate: date('2019-12-31')}]-(b2:OrgUnit {name: 'B2'}),
  (a)<-[:BELONGS_TO {beginDate: date('2010-01-01'), endDate: date('2019-12-31')}]-(b3:OrgUnit {name: 'B3'}),
  (b2)<-[:BELONGS_TO {beginDate: date('2010-01-01'), endDate: date('2019-12-31')}]-(c1:OrgUnit {name: 'C1'}),
  (b2)<-[:BELONGS_TO {beginDate: date('2015-01-01'), endDate: date('2019-12-31')}]-(c2:OrgUnit {name: 'C2'}),
  (b2)<-[:BELONGS_TO {beginDate: date('2018-01-01'), endDate: date('2019-12-31')}]-(c3:OrgUnit {name: 'C3'}),
  (b3)<-[:BELONGS_TO {beginDate: date('2010-01-01'), endDate: date('2019-12-31')}]-(c4:OrgUnit {name: 'C4'}),
  (b3)<-[:BELONGS_TO {beginDate: date('2020-01-01'), endDate: date('2021-12-31')}]-(c5:OrgUnit {name: 'C5'}),
  (c4)<-[:BELONGS_TO {beginDate: date('2019-01-01'), endDate: date('2019-12-31')}]-(d1:OrgUnit {name: 'D1'});

initial situation

解决方案

MATCH path = (root:OrgUnit {name: 'A'})<-[*..10]-(:OrgUnit)
WITH path WHERE 
  ALL(x IN relationships(path) WHERE x.beginDate <= $startDate) AND
  ALL(x IN relationships(path) WHERE x.endDate >= $endDate)
RETURN path;

使用的参数:

  • $startDate = date('2018-01-01')
  • $endDate = date('2019-01-01')

说明:

  • 第1行:假设最大组织深度为10,则匹配从根OrgUnit(CEO)到每个OrgUnit的所有可能路径
  • 第3行:过滤掉并非所有关系都符合我们的$startDate参数的路径
  • 第4行:过滤掉并非所有关系都符合我们的$endDate参数的路径
  • 第5行:渲染结果路径

结果

resulting graph

OrgUnit的B1,C5和D1仅在“ 2019-01-01”,“ 2020-01-01”和“ 2019-01-01”有效,因此被省略。

备注

Neo4j并不专注于搜索和过滤关系属性。将这些属性建模为节点或节点的属性的性能明显更高,尤其是对于大型图形。