【问题标题】:How to implement an EAV model in Neo4j?如何在 Neo4j 中实现 EAV 模型?
【发布时间】:2015-04-15 22:30:02
【问题描述】:

实体-属性-值(EAV)模型确实很强大,但是complex to implement using SQL,所以人们often look for alternatives to EAV。它似乎是图形数据库的完美候选者。我了解如何构建一个电影数据库,其中有带有 Neo4j 标签“电影”的节点,节点上的属性为“release_date”。您如何使其更通用,使得电影在通用 EAV 模型之后具有 Neo4j 标签“实体”?

【问题讨论】:

    标签: neo4j entity-attribute-value


    【解决方案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 label、“Value”),并具有来自 Attribute 和 User 节点的传入关系。

    完整的表单有Type节点、Attribute节点、User节点、Value节点和Entity 节点,其中的关系基本上没有属性。

    【讨论】:

      【解决方案2】:

      为什么首先需要它?

      我一直认为 EAV 只是关系数据库的一种解决方法,它不是无模式的。

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

      如果您需要,您还可以将 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 关系。

      【讨论】:

      • 我幼稚的理解 EAV 是它可以允许用户创建任意实体和属性。如果没有这些,允许用户创建任意关系、属性和标签是否是一种好习惯?例如,假设用户 MichaelHunger 创建了一个带有 ComicBook 标签的“蝙蝠侠”实体,并且与另一个实体有 WRITTEN_BY 关系。在不提前知道它们是什么的情况下,如何与任意一组实体和关系进行交互?
      • 您仍然会将元信息存储在您的应用程序或图表中(作为元图),但真实数据不会被非规范化,而只是属性图模型的一部分
      • 你甚至可以从实际图推断元图,这里是一个简单的例子:gist.neo4j.org/?dropbox-14493611%2Fmeta_graph.adoc
      猜你喜欢
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多