Подход 2 нецелесообразен, если у вас есть уникальный (и, следовательно, общий) узел Period
для каждого конкретного периода времени, поскольку для этого узла может быть любое количество ASSIGNED
отношений, и вы не сможетесказать, какое из этих отношений принадлежало какому животному (без избыточного хранения идентификатора животного в каждом отношении).
При подходе 1 давайте предположим, что эта модель данных (где A
представляет: «животное назначеноклетка, которая находится в пространстве ", а B
обозначает:" животное назначено непосредственно в пространство, а не клетку "):
A. (:Animal)-[:ASSIGNED {start: 123, end: 789}]->(:Cage)-[:LOCATED_IN]->(:Space)
B. (:Animal)-[:ASSIGNED {start: 234, end: 777}]->(:Space)
Чтобы получить информацию обо всех животных, занимающих то же самоеклетка в то же время:
MATCH
(a1:Animal)-[r1:ASSIGNED]->(c:Cage),
(a2:Animal)-[r2:ASSIGNED]->(c)
WHERE ID(a1) < ID(a2) AND r1.start < r2.end AND r2.start < r1.end
RETURN c, a1, r1, a2, r2
Чтобы получить информацию обо всех животных, занимающих одно и то же пространство одновременно:
MATCH
(a1:Animal)-[r1:ASSIGNED]->()-[:LOCATED_IN*0..1]->(s:Space),
(a2:Animal)-[r2:ASSIGNED]->()-[:LOCATED_IN*0..1]->(s)
WHERE ID(a1) < ID(a2) AND r1.start < r2.end AND r2.start < r1.end
RETURN s, a1, r1, a2, r2
ПРИМЕЧАНИЯ:
- Тест
ID(a1) < ID(a2)
предназначен для избежания дублирования результатов (животные 1 и 2, а затем снова как 2 и 1). - Тест
r1.start < r2.end AND r2.start < r1.end
предназначен для обнаружения перекрывающихся времен занятости. (x)-[:LOCATED_IN*0..1]->(y)
синтаксис matcОн имеет путь переменной длины либо длины 0 (в этом случае нет отношения LOCATED_IN
, а x
совпадает с y
), либо длины 1.