Neo4j对象图映射如何实现关系


Neo4j Object Graph Mapping how to implement relationships

我正在为Neo4j开发对象图映射器(OGM)。它帮助我更好地理解Neo4j的工作流程。我在实现一个对象的关系时遇到了一个大问题。

我处理OGM本身的方式是基于索引创建"模型"。因此,索引"users"对应于类"User"。所有属性都按预期工作等等。当涉及到关系时,我试图实现类似于ORM关系的关系。然而,SQL和图数据库之间的一个很大区别是,图没有静态表;关系端点的"类型"可以随节点的不同而变化。例如,如果我有一个"赞"关系,它可以转到节点类"书"、"电影"。我不能像创建SQL那样创建关系:(relationshipName,relationshipType,fkID,modelName)。

我应该如何处理这个问题?什么是更好的设计方案?我应该根据节点的索引自动查找类吗?我应该省略没有相同索引的对象吗?

我现在实现它的方式是(relationshipName、relationshipType、relationsshipDirection、modelName)。用法示例为("likedBy"、"likes"、"in"、"User")、("likes"、"like"、"out"、"Thing")。

当谈到构建OGM时,我也在努力。我觉得它们至少是两种需要注意的约束。

第一种约束是您所描述的,我们称之为"属性模式"。它为元素(即节点或关系)上的属性设置模式。使用它,您可以对特定属性进行索引,为节点提供标签,基于特定属性施加唯一性约束,并可以对所放置的数据元素施加软约束。像Date属性一样,应该在1-31之间。Neo4j目前不支持唯一性约束以外的任何约束。因此,这些必须在OGM层面上强制执行。

另一种需要的约束是结构模式。这将对元素(即节点或关系)施加一组结构约束。这些约束集将确保元素在连接到其邻域元素时遵循所有条件。在这些约束集中,您可以定义关系的约束,例如:类型为LIKES的关系可以将标签为USER的节点连接到标签为BOOK or MUSIC or (FOOD and DRINK)的节点。类似地,您可以对节点施加约束,例如:标签为USER的节点需要使用类型为Friend的传出关系连接到至少一个标签为USER的节点。

您可以使用密码语言MATCH模式来表达这些类型的约束。我目前正在为node.js开发这个OGM的第一阶段。这是我目前对如何处理这个问题的理解。希望能有所帮助。