【问题标题】:Neo4j Object Graph Mapping how to implement relationshipsNeo4j Object Graph Mapping 如何实现关系
【发布时间】:2013-11-22 13:59:07
【问题描述】:

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

我处理 OGM 本身的方式是根据索引创建“模型”。所以索引“用户”对应于类“用户”。所有属性都按预期工作等。当涉及到关系时,我尝试将其实现为类似于 ORM 关系。但是,SQL 和图数据库之间的一大区别是,图没有静态表。和关系端点“类型”可以从节点更改为节点。例如,如果我有“喜欢”的关系,它可以转到节点类“书”、“电影”。我不能像创建 SQL 一样创建关系:(relationshipName、relationshipType、fkID、modelName)。

我应该如何解决这个问题?什么是更好的设计选择?我应该根据节点的索引自动找到类吗?我应该省略没有相同索引的对象吗?

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

【问题讨论】:

    标签: php sql orm neo4j


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-09
      • 2021-05-17
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多