实体 - 属性 - 值(EAV)模型非常强大,但是complex to implement using SQL,因此人often look for alternatives to EAV。它似乎是图形数据库的完美候选者。我理解如何构建一个电影数据库,其中你有节点,Neo4j标签为“Movie”,节点上的属性为“release_date”。你会如何使这个更通用,以便电影在通用EAV模型之后具有Neo4j标签“Entity”?
答案 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节点的传入关系。
完整表单包含类型节点,属性节点,用户节点,值节点和实体节点,其中关系基本上没有属性。
答案 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
关系。