【问题标题】:How to avoid creating duplicate nodes when ID is not knownID未知时如何避免创建重复节点
【发布时间】:2016-02-15 16:07:46
【问题描述】:

我正在使用 Neo4J 来保存来自 Git-lab 网络挂钩的事件。 可以在此处找到数据示例https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/web_hooks/web_hooks.md#push-events 其中一个节点是作者 {name,email}

这里的电子邮件是自然的唯一 ID。 在 Hibernate(JPA) 中有一个名为 @Id 的注释,我可以在作者字段电子邮件 (ref to docs) 上设置它。 如何使 Neo4J OGM 基于电子邮件而不是它的 id 持久/合并?

【问题讨论】:

标签: java neo4j neo4j-ogm


【解决方案1】:

最快/最简单的解决方案之一是使用constraints

Create CONSTRAINT ON (a:Author) ASSERT a.email IS UNIQUE

这样,neo4j 将确保遵守约束,并且您不必在服务器端实现唯一性,因为数据库正在这样做。

【讨论】:

  • 如果我做一个约束,当我尝试坚持时我会得到一个错误。问题不在于 DB 端,而在于如何调整 OGM 框架以合并而不是创建新节点。
【解决方案2】:

在 ETL 工具中,您可以合理地期望能够定义您的源密钥/身份。 Neo4j OGM 并不是真正的 ETL 工具,但如果您想将其用作数据导入器,您有几个选择。

首先是自己管理键映射。当然,这可能是不切实际的,这取决于数量和其他考虑。第二个是始终尝试通过其电子邮件地址从图表中获取给定对象,然后再从您的事件提要中保存任何项目。

【讨论】:

  • ETL 工具?我想要的是一种简单的方法来定义实体如何相似。现在,正如我从文档中看到的那样,唯一确定相似性的是@GraphId,它仅限于 Long。我需要来自 JPA 的 @Id 之类的东西。
【解决方案3】:

我有几个 cmets。

  1. Administrator 似乎是 name 属性的值,而不是 email 属性的值。您确定图像中的 3 个Administrator 节点实际上具有相同的email 属性值吗?为了让 neo4j 浏览器显示 email 值,Author 节点的 set the captionemail 而不是 name

  2. 除上述之外,您似乎已经尝试过这个 Cypher 查询,但得到的似乎是重复的:

    MERGE (n:Author {name: {name}, email: {email}})
    RETURN n
    

    如果输入数据可能包含同一电子邮件地址的多个名称,则可以解释这一点。在这种情况下,以下查询应防止“重复”Author 节点。如果带有参数化电子邮件地址的Author 已经存在(无论其name 值如何),它只返回现有节点(不更改其name);否则,它将使用参数化的emailname 属性创建一个新的Author 节点。此解决方案意味着只有遇到email 地址的第一个name 将存储在数据库中。

    MERGE (n:Author {email: {email}})
    ON CREATE SET n.name = {name}
    RETURN n
    

【讨论】:

  • 作者在示例中具有相同的电子邮件和姓名。我知道如何使用 cypher 来做到这一点,但是我(就像你一样)必须自己编写所有持久性代码,因此 OGM 框架的目的就丢失了。我想要的是相当于 JPA 的@Id。我更新了问题以突出这个问题。
猜你喜欢
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 2018-03-17
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多