实体-属性-值(EAV)模型非常强大,但是complex to implement using SQL,因此人们often look for alternatives to EAV。这似乎是图形数据库的完美候选。我了解如何构建一个电影数据库,在该数据库中,节点上有带有Neo4j标签" movie“的节点,其属性为"release_date”。您将如何使这更通用,使电影有Neo4j标签“实体”遵循一般的EAV模型?
发布于 2015-02-15 07:49:41
我想了很多,但是,我不相信我有一个很好的解决方案,。反正我也要试一试。以下是最基本的模型:
<node> <relationship> <node>
Attribute --> :VALUE --> Entity
name="Label",type="string" --> value="Movie" --> name="The Matrix"使用此模型,您可以编写如何显示和编辑Attribute.type的代码。例如,可能所有标签都有一个在前端有有限选项的文本字段,而所有日期都有一个日期选择器。您可以将Attribute.type分解为它自己的节点Type,如果这更好的话(特别是对于处理复合类型来说是有意义的)。在这种情况下,属性和类型节点之间的关系类型。
如果实体有多个关系(就像评审的情况一样),或者您想将值与其他东西(例如分配值的用户)关联起来,这就变成了一个问题。现在,我认为,关系"VALUE“必须是它自己的"Value”类型的节点(即具有Neo4j标签"Value"),它具有来自属性节点和用户节点的传入关系。
完整的表单有Type节点、属性节点、用户节点、值节点和实体节点,在这些节点上,关系基本上没有属性。

发布于 2015-02-16 03:59:55
你为什么一开始就需要它?
我一直认为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关系的标签。
https://stackoverflow.com/questions/28524038
复制相似问题