如何在Neo4j中实现EAV模型?

时间:2015-02-15 07:49:41

标签: neo4j entity-attribute-value

实体 - 属性 - 值(EAV)模型非常强大,但是complex to implement using SQL,因此人often look for alternatives to EAV。它似乎是图形数据库的完美候选者。我理解如何构建一个电影数据库,其中你有节点,Neo4j标签为“Movie”,节点上的属性为“release_date”。你会如何使这个更通用,以便电影在通用EAV模型之后具有Neo4j标签“Entity”?

2 个答案:

答案 0 :(得分:1)

我对此有很多想法,但我不相信我有一个很好的解决方案。无论如何,我会捅它。这是最基本的模型:

<node>                         <relationship>    <node>
Attribute                  --> :VALUE        --> Entity
name="Label",type="string" --> value="Movie" --> name="The Matrix"

使用此模型,您可以编写有关如何显示和编辑Attribute.type的代码。例如,也许所有标签在前端都有一个带有限制选项的文本字段,所有日期都有一个日期选择器。你可以将Attribute.type分解为它自己的节点Type,如果这是更可取的(特别是对处理复合类型有意义)。在这种情况下,您在Attribute和Type节点之间具有TYPE关系。

如果实体具有多个关系(如评论的情况)或者您希望将值与其他内容(例如分配值的用户)相关联,则会出现问题。现在,我认为,关系“VALUE”必须是它自己的“Value”类型的节点(即具有Neo4j 标签,“Value”),它具有来自Attribute和User节点的传入关系。

完整表单包含类型节点,属性节点,用户节点,节点和实体节点,其中关系基本上没有属性。

enter image description here

答案 1 :(得分:1)

为什么你首先需要它?

我一直认为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关系。