如何在Neo4j中实现EAV模型?

如何在Neo4j中实现EAV模型?,neo4j,entity-attribute-value,Neo4j,Entity Attribute Value,实体属性值(EntityAttribute-Value,EAV)模型确实很强大,但是,人们也这么认为。它似乎是图形数据库的完美候选。我了解如何构建一个电影数据库,其中节点上有Neo4j标签“movie”和属性“release_date”。您如何使其更通用,从而使电影具有Neo4j标签“实体”,遵循通用EAV模型?对此我想了很多,但我不相信我有一个好的解决方案。不管怎样,我还是要试试看。以下是最基本的模型: <node> <rela

实体属性值(EntityAttribute-Value,EAV)模型确实很强大,但是,人们也这么认为。它似乎是图形数据库的完美候选。我了解如何构建一个电影数据库,其中节点上有Neo4j标签“movie”和属性“release_date”。您如何使其更通用,从而使电影具有Neo4j标签“实体”,遵循通用EAV模型?

对此我想了很多,但我不相信我有一个好的解决方案。不管怎样,我还是要试试看。以下是最基本的模型:

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

属性-->:值-->实体
name=“Label”,type=“string”-->value=“Movie”-->name=“矩阵”
使用此模型,您可以编写有关如何显示和编辑Attribute.type的代码。例如,可能所有标签的前端都有一个带有有限选项的文本字段,而所有日期都有一个日期选择器。您可以将Attribute.type分解为它自己的节点type,如果这样做更可取的话(特别是对于处理复合类型来说更有意义)。在这种情况下,属性和类型节点之间就有了关系类型

如果实体具有多个关系,这将成为一个问题,例如审查的情况,或者如果您希望将该值与其他对象(例如分配该值的用户)相关联。现在,我认为,关系“VALUE”必须是它自己的类型为“VALUE”的节点(即具有Neo4j标签“VALUE”),具有来自属性和用户节点的传入关系

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


你为什么首先需要它

我一直认为EAV只是关系数据库的一个解决方案,而不是无模式的

与其他nosql数据库一样,Neo4j是无模式的,因此您只需将想要的属性添加到节点和关系中即可

如果需要,还可以在图中的元模式中记录EAV模型,但在大多数情况下,如果元模式位于创建和使用属性的应用程序中,就足够了

通常,我将标签视为在特定上下文中提供特定属性和关系的角色。一个节点可以有多个标签,每个标签代表其中一个角色

E.g. for the same node
:Person(name)-[:LIVES_IN]->(:City)
:Employee(empNo)-[:WORKS_AT]->(:Company)
:Developer()-[:HAS_SKILL]->(:CompSkill)
...
因此,在您的例子中,
:实体
将只是一个暗示
名称
属性的标签


:Movie
是一个标签,它暗示了
发布日期
属性,例如
在关系中的行为。

我对EAV的天真理解是,它允许用户创建任意实体和属性。如果没有这一点,允许用户创建任意关系、属性和标签是否是一种好的做法?例如,假设用户MichaelHunger创建了一个“蝙蝠侠”实体,该实体带有一个ComicBook标签,并通过与另一个实体的关系创建了一个writed_。那么,在不提前知道实体和关系是什么的情况下,您如何与这些任意的实体和关系进行交互?您仍然可以将元信息存储在应用程序或图形(作为元图形)中但实际数据不会被非规范化,而只是属性图模型的一部分。您甚至可以从实际图中推断出元图,这里是一个简单的示例: