Оказывается, есть 4 способа, которыми диапазоны дат могут перекрываться, но только 2, в которых они не перекрываются (человек 1 заканчивается до того, как человек 2 начинает, или человек 2 заканчивается, пока человек 1 не начинает), поэтому намного прощеубедитесь, что ни одно из этих условий не перекрывается.
В случае уровня 1 этот запрос должен выполнить свою задачу:
MATCH (start:Person{id:1})-[r1:LINK]->(c)<-[r2:LINK]-(suggest)
WHERE NOT ((r1.endDate IS NOT NULL and r1.endDate < r2.startDate)
OR (r2.endDate IS NOT NULL and r2.endDate < r1.startDate))
RETURN suggest
Сложная часть применяет это к нескольким уровням.
Хотя мы могли бы создать один запрос Cypher для его динамической обработки, оценка отношений будет происходить только после расширения, а не во время, поэтому он может быть не самым эффективным:
MATCH path = (start:Person{id:1})-[:LINK*..6]-(suggest:Person)
WITH path, start, suggest, apoc.coll.pairsMin(relationships(path)) as pairs
WITH path, start, suggest, [index in range(0, size(pairs)-1) WHERE index % 2 = 0 | pairs[index]] as pairs
WHERE none(pair in pairs WHERE (pair[0].endDate IS NOT NULL AND pair[0].endDate < pair[1].startDate)
OR (pair[1].endDate IS NOT NULL AND pair[1].endDate < pair[0].startDate))
RETURN suggest
Некоторые из основных моментов здесь ...
Мы используем apoc.coll.pairsMin()
из процедур APOC, чтобы получить пары смежных отношений из коллекции отношений в каждом пути, но нас интересует только четноепронумерованные записи (два отношения от людей, работающих в одной и той же компании), потому что нечетные пары соответствуют отношениям одного и того же человека, идущего в две разные компании.
Итак, если мы выполняем по этому шаблону:
MATCH path = (start:Person)-[r1:LINK]->(c1)<-[r2:LINK]-(person2)-[r3:LINK]->(c2)<-[r4:LINK]-(person3)
apoc.coll.pairsMin(relationships(path))
вернет [[r1, r2], [r2,r3], [r3,r4]]
, и, как вы видите, отношения, которые мы должны рассмотреть, связывают двух человек с компанией, поэтому индексы 0 и 2в списке пар.
После того, как мы получим наши пары, мы должны убедиться, что все эти интересные пары отношений в патh считается, что предложение соответствует вашим критериям и перекрывается (или не перекрывается).