Определить отношения в узлах или в ссылках?

Я узнаю о базе данных nosql и neo4j. Я хочу знать, когда я должен определить отношения в узлах или в ссылках?

Например:

(teacher)-[:TEACHS]->(student)

или же

(Person)-[:TEACHS]->(Person)

Я знаю, что это не хороший пример для моего вопроса. Но я думаю, что это важная тема в Neo4j или теории графов, но я не смог найти примеров или обсуждений по этой теме...

2 ответа

Решение

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

Например, вы можете решить, что самый важный вопрос звучит так: "учитывая имя учителя, сколько у них учеников?"

MATCH ({name: "Bob"})-[:TEACHES]->(p) RETURN count(p)

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

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

MATCH (t:Teacher) RETURN t.name

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

MATCH (:Teacher {name: {"Bob"})-[:TEACHES]->(p) RETURN count(p)

Но на самом деле стоит попытаться помешать себе слишком много заниматься моделированием заранее и включать в модель то, что может не понадобиться. Вы обнаружите, что это приводит к гораздо более простой и более гибкой модели.

Это поднимает вопрос о том, как изменять данные при изменении модели. Обычно вы обнаружите, что существует ряд безопасных, простых рефакторингов, которые вы можете выполнять по ходу работы, как если бы вы рефакторинг кода. В этом случае вам нужно добавить метки ко всем узлам, где :TEACHES отношения начинаются.

MATCH (t)-[:TEACHES]->() SET t:Teacher

Я бы сказал, что это немного зависит от вашего домена. И то и другое

(teacher:Person:Teacher)-[:TEACHES]->(student:Person:Student)

Определяет три метки - Person, Teacher а также Student, Это помогает в определении обходов. Однако, если вы хотите обрезать обходы даже на уровне отношений, вы также можете сделать

(teacher:Person)-[:TEACHERS_TEACHES_STUDENT]->(student:Person)

Таким образом, затрагивая типы узлов. В то время как типы отношений приятно использовать по смысловым и обходным причинам, их не существует бесконечное количество, и их обход с помощью регулярных выражений и т. Д. Невелик. Поэтому не кодируйте значения отношений в типы отношений, такие как даты или около того (например, [:TEACHED_FROM_2013_to_2014])

Другие вопросы по тегам