Пример данных
Для простоты возможных дальнейших ответов и решений отмечу мое утверждение создания графика:
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: рендеринг результирующих путей
Результат
The OrgUnit
s B1, C5 и D1 опущены, поскольку они действительны только для "2019-01-01", "2020-01-01" и "2019-01-01".
Примечание
Neo4j не фокусируется на поиске и фильтрации свойства отношения .Моделирование этих атрибутов как узла или свойства узла значительно более производительно, особенно для больших графов.