示例数据
为了方便可能的进一步答案和解决方案,我记下了我的图表创建声明:
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'});
解决方案
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行:匹配从根
OrgUnit(CEO)到每个OrgUnit的所有可能路径,假设最大组织深度为10
- 第 3 行:过滤掉那些并非所有关系都符合我们的
$startDate 参数的路径
- 第 4 行:过滤掉那些并非所有关系都符合我们的
$endDate 参数的路径
- 第 5 行:渲染结果路径
结果
OrgUnits B1、C5 和 D1 被省略,因为它们仅在“2019-01-01”、“2020-01-01”和“2019-01-01”期间有效。
备注
Neo4j 不专注于搜索和过滤关系属性。将这些属性建模为节点或节点的属性会显着提高性能,尤其是对于大型图。