Как выразить временную (временную) связь в базе данных графа neo4j - PullRequest
0 голосов
/ 27 февраля 2019

Привет, у меня есть следующие отношения, которые я хотел бы выразить в neo4j, и я хотел бы найти оптимальный путь, или, возможно, не оптимальный, но другие способы, которыми я могу сделать это хорошим способом.Случай таков:

  • У меня есть животное
  • Животное может быть помещено в клетку или в открытое поле.
  • Отношения между животным иКлетка действительна в течение периода времени.

Период времени является очень важным качеством, так что в некотором смысле это первоклассный гражданин модели.Что мне интересно, так это то, что если я выражаю это как модель Neo4J, я могу сделать это несколькими способами:

Aproach 1.

  • Животное - это узел.
  • Клетка / Открытое пространство - это узел.
  • Период времени становится свойством в соответствии с отношением «Назначено».

Подход 2.

  • Животное - это узел.
  • Период времени - это узел.
  • Клетка / Открытое пространство -узел.

Тогда отношения будут выглядеть так.* Animal --FOR -> Period --Assigned -> CAGE

На какие вопросы должна отвечать модель.

Мы должны быть в состоянии собратьинформация о том, что все животные были размещены вместе в один и тот же промежуток времени в одной клетке.Дело в том, что в одном открытом пространстве может быть много Клеток, поэтому мы хотели бы выяснить, находились ли когда-либо два животных в одном и том же открытом пространстве.

1 Ответ

0 голосов
/ 28 февраля 2019

Подход 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.
...