Как реализовать модель EAV в Neo4j?
Модель Entity-Attribute-Value (EAV) действительно мощная, но сложная для реализации с использованием SQL, поэтому люди часто ищут альтернативы EAV. Похоже, идеальный кандидат для графовых баз данных. Я понимаю, как создать базу данных фильмов, в которой у вас есть узлы с меткой Neo4j "Movie" со свойством "release_date" прямо на узле. Как бы вы сделали это более общим, чтобы у фильмов был ярлык Neo4j "Entity", соответствующий общей модели EAV?
2 ответа
Зачем вам это нужно в первую очередь?
Я всегда думал, что EAV - это просто обходной путь для реляционных баз данных, не являющихся свободными от схем.
Neo4j, как и другие базы данных nosql, не содержит схемы, поэтому вы можете просто добавить нужные атрибуты как для узлов, так и для связей.
Если вам нужно, вы можете также записать модель EAV в мета-схеме внутри графика, но в большинстве случаев будет достаточно, если мета-схема живет в приложении, которое создает и использует ваши атрибуты.
Обычно я рассматриваю метки как роли, которые в определенном контексте обеспечивают определенные свойства и отношения. Узел может иметь много меток, каждая из которых представляет одну из этих ролей.
E.g. for the same node
:Person(name)-[:LIVES_IN]->(:City)
:Employee(empNo)-[:WORKS_AT]->(:Company)
:Developer()-[:HAS_SKILL]->(:CompSkill)
...
Так что в вашем случае :Entity
будет просто метка, которая подразумевает name
имущество.
А также :Movie
это метка, которая подразумевает release_date
собственность и, например, ACTED_IN
отношения.
Я много думал об этом, но я не уверен, что у меня есть хорошее решение. Я в любом случае нанесу удар. Вот самая основная модель:
<node> <relationship> <node>
Attribute --> :VALUE --> Entity
name="Label",type="string" --> value="Movie" --> name="The Matrix"
С помощью этой модели вы можете написать код для отображения и редактирования Attribute.type. Например, может быть, все метки имеют текстовое поле с конечными параметрами в интерфейсе, а все даты имеют указатель даты. Вы можете разбить Attribute.type на его собственный узел Type, если это предпочтительнее (особенно это имеет смысл для обработки составных типов). В этом случае у вас есть отношение TYPE между узлами Attribute и Type.
Это становится проблемой, если сущности имеют несколько взаимосвязей, как в случае обзоров, или если вы хотите связать значение с чем-то другим, например с пользователем, который назначил значение. Теперь, я думаю, отношение "VALUE" должно быть собственным узлом типа "Value" (т. Е. Имеет метку Neo4j, "Value") с входящими отношениями из обоих узлов Attribute и User.
Полная форма имеет узлы типа, узлы атрибутов, узлы пользователей, узлы значений и узлы сущностей, в которых отношения практически не имеют свойств.