Выбор дизайна Neo4j: отношения против узлов - PullRequest
0 голосов
/ 29 мая 2018

Я имею дело со следующей ситуацией: между многими городами существует много поездок.Оба имеют различные свойства.Например, у городов есть название и количество поездок, которые их прошли, тогда как у поездок есть расстояние и время.

Что такое «лучшая практика» в Neo4j?

a) Добавьте все города и поездки как узлы и соедините поездки с начальным и конечным узлами с помощью отношений 'STARTED_AT' и 'ENDS_IN'.

или

b) Добавьте только города в качестве узла и представьте каждую из поездок как отношение между 2 узлами.Это означает, что существует много одинаковых отношений между узлами, где единственное отличие состоит в том, что они имеют другие свойства.

Информация, которая может быть полезна: нам нужно только выполнять все виды запросов.Вставка не требуется.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Я бы сказал, что лучше хранить поездки как узлы, потому что свойства отношений не могут быть проиндексированы, а выполнение более сложных запросов будет медленным (например, поиск кратчайшего маршрута по времени). Поэтому, если вы ищете поездки по ID или чем-то еще,вам нужно будет хранить их как узлы.

С другой стороны, можно использовать аргумент для использования отношений, потому что тогда вы сможете в полной мере воспользоваться функциями поиска взвешенного графа APOC ..

Хороший способ решить, должен ли что-то быть узлом или отношением, - спросить себя: «Есть ли здесь какие-то другие отношения, которые имеют смысл?»Если вы говорите о том, связаны ли два города, отношения становятся более важными, поскольку они либо есть, либо нет.Однако, если вы говорите о поездках по дороге, поездка может проходить через несколько городов, может иметь участников в поездке (или групп там) и может иметь владельца.В этом случае, для будущей гибкости, узлы будут намного проще поддерживать.

0 голосов
/ 30 мая 2018

Я бы сказал, что это действительно зависит от того, как вы смоделируете эти поездки, давайте предположим, что мы можем обобщить это как (город) - [поездка] -> (город).Обратите внимание, что отношения neo4j всегда имеют направление, поэтому мы можем продолжать добавлять неограниченное количество поездок между городами без необходимости переопределять каждый город для каждой поездки - это фактически отвечает (а), кстати, нам не нужно определять, гдеон начинает и заканчивает, отношение делает все, что у вас работает.

'Это означает, что между узлами существует много одинаковых отношений' << - в этой заметке, если вам нужно различать каждую поездку в зависимости от времениКогда поездка была предпринята, вы можете добавить дату / время в свойстве отношения или вы можете использовать дерево времени (см. <a href="https://markhneedham.com/blog/2014/04/19/neo4j-cypher-creating-a-time-tree-down-to-the-day/" rel="nofollow noreferrer" title="Neo4j: Cypher - Creating a time tree down to the day"> Статья Марка Нидхэма об этом здесь и Взятие Graphgrid ) Надеюсь, это поможет.

...