Быстрый ответ, да, атрибут заказа на краю CONTAINS
, и что касается производительности, очень быстро.
Следует ли добавить «порядок» в отношения СОДЕРЖИТ?
Да, имеет смысл добавить свойство заказа в CONTAINS
кромки.
Почему это имеет смысл? Представим себе другие места для хранения упорядочения текстов в рукописи:
a) Сохранение порядка текстов в рукописи: для этого вам нужно будет сохранить список [ текст, порядок], чтобы узнать, какой текст находится в каком положении.
b) Сохранение порядка текстов в самом тексте: в этом случае в текстовом узле вам необходимо сохранить список [рукопись, заказ], чтобы узнать, в каком положении рукописи текст присутствует, для каждой из разных рукописей текст появляется.
Хотя эти 2 являются допустимыми параметрами для моделирования, когда вы пытаетесь выполнить запросы с этими двумя различными вариантами, вы сделали это сложнее для себя, когда дело доходит до вставлять, редактировать, удалять или запрашивать узлы.
насчет производительности в запрашивая:
Прежде чем ответить на конкретные сценарии, просто напоминание, чтобы иметь в виду: доступ к узлу и пересекающих отношения в Neo4j, оба имеют стоимость O(1)
,
Редактировать: дополнительная информация о производительности в этом другом question from SO
получить список заказа текстов contening в конкретной рукописи
Так рукопись с n
текстов, общее стоимость операции по извлечению всех текстов будет примерно O(n)
, и все они будут отсортированы, можно взять стоимость O(n*log n)
, так что это будет зависеть от количества тексты на одну рукопись.
Update: Если вы хотите, чтобы сравнить стоимость с реляционными базами данных, в соответствии с просьбой в комментарии, ну, asuming подобную модель, с 3-мя столами, один для рукописей, один для текста, и один для отношений с порядок, следуя принципу «многие ко многим со свойствами». Вы закончите сканирование всей таблицы отношений, что будет означать, что стоимость будет выше, поскольку она будет зависеть от всех существующих отношений между всеми манускриптами и текстом, а не только подмножеством.
известно, в каких рукописях текст предшествует и другие тексты и в котором он находится после того же текста. Это, например, я хочу знать все рукописи, где текст «А» находится перед «В», и все рукописи, где текст «В» находится перед текстом «А».
Зная, в котором рукописи текст находится, так же легко, как пересекающая все входящие CONTAINS
отношений, то есть эта операция O(n)
, будучи n
количеством рукописей появляется текст.
Но для рукописи, где текст A появляется перед текстом B, это немного сложнее и дороже, я попытаюсь сломать его:
Учитывая, что n
- это количество рукописей, в которых появляется текст A, и m
- количество рукописей текста B появляется.
Сначала необходимо будет найти все рукописи текст А находится в, а также все рукописи текст B находится в. Стоимость этой операции O(n+m)
, которая до сих пор линейная
Затем необходимо отфильтровать эти списки, чтобы найти рукописи, которые появляются в обоих списках. Это снова стоит O(n+m)
.
И, наконец, фильтровать снова манифестах, где исходящие CONTAINS
края, имеют свойство порядка, где порядок CONTAINS
в текст А меньше, чем свойство порядка CONTAINS
к тексту B. Стоимость этого будет примерно O(k)
где k
является размером списка рукописей, результат шага 2.
для этого случая, при использовании реляционных баз данных, будет необходимо сканировать всю таблицу отношения, которая будет менее производительным, как это будет зависеть от количества строк в таблице, а не только от подмножества.
перед обновлением моего ответа с последним уточнением, вы хотите, чтобы получить как списки рукописей (A до B, и B, прежде A) в том же запросе? или вы планируете иметь один запрос и использовать его дважды с обратным порядком текста? – saljuama
о, это может быть в двух запросах, или в одном, не имеет значения. –