Любое практическое правило о том, где использовать метку против свойства узла против отношения + узла.

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

Было бы лучше использовать:

  1. У меня есть узел с sku 001, и я помечу его меткой Food.
  2. У меня есть узел с sku 001, и у меня есть свойство на этом узле под названием category:"Food"
  3. У меня есть узел с sku 001, и я создам еще один узел для Food и создам связь "category", чтобы связать их.

Я читал, что если вы будете искать свойство, лучше использовать связь + узел, поскольку обход выполняется намного быстрее, чем поиск свойств узла.

Tia

52
lorraine 12 Мар 2014 в 05:56

2 ответа

Лучший ответ

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

(Я предполагаю, что у вас довольно небольшой, довольно фиксированный набор категорий.)

Используйте свойство , если вы не будете запрашивать по категории, а просто должны вернуть категорию узла, найденного другими способами. (Например: к какой категории относится товар с sku 001?)

Используйте ярлык , если вам нужно выполнить запрос по категории. (Например: какие продукты стоят менее 10 долларов?)

Используйте узел , если вам нужно пройти по категории, не зная, что это такое. (Например: какие десять самых популярных товаров в той же категории, что и тот, который выбрал пользователь?)

66
Ben Butler-Cole 13 Мар 2014 в 13:26
Можно ли с уверенностью предположить, что третий вариант является наиболее надежным в том смысле, что вы могли бы легко достичь всех трех целей с такой структурой с наименьшим влиянием на производительность, в отличие от двух других методов? Я представляю структуру для этого вопроса, похожую на: 1 (:user)-[LIKES]->(:node:food {sku: 1, cost: 10}), 2 (:user)-[LIKES]->(:node {sku: 1, category: "food", cost: 10}) и 3 (:user)-[LIKES]->(:node {sku: 1, cost: 10})-[HAS_CATEGORY]->(:Category {name: "food"}), где вариант 3 позволяет проще всего запросить все 3 ваших примера.
 – 
ctwheels
11 Мар 2022 в 22:48

Эта запись в блоге также может быть полезна из-за содержащихся в ней тестов.

Я смоделировал «отношения» 4 разными способами ...

  • Использование определенного типа отношений (node)-[:HAS_ADDRESS]->(address)
  • Использование общего типа связи с последующей фильтрацией по метке конечного узла (node)-[:HAS]->(address:Address)
  • Использование общего типа отношения с последующей фильтрацией по свойству отношения (node)-[:HAS {type:“address”}]->(address)
  • Использование общего типа отношения с последующей фильтрацией по свойству конечного узла (node)-[:HAS]->(address {type: “address”})

<...>

Итак, вкратце… конкретные отношения #ftw!

12
Poliakoff 5 Дек 2016 в 13:49
Тесты дают очень хороший указатель, но они показывают, что использование определенных отношений быстрее, чем общие. Их решение об использовании свойства, метки или узла по-прежнему зависит от самих запросов.
 – 
ahmedhosny
16 Июл 2020 в 05:35