如何在ID未知时避免创建重复节点

时间:2016-02-15 16:07:47

标签: java neo4j neo4j-ogm

我正在使用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来持久/合并?

enter image description here

3 个答案:

答案 0 :(得分:0)

其中一个最简单/最简单的解决方案是使用constraints

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

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

答案 1 :(得分:0)

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

首先是自己管理密钥映射。当然,这可能是不切实际的,取决于数量和其他考虑因素。第二种方法是在保存事件Feed中的任何项目之前,始终尝试通过其电子邮件地址从图表中获取给定对象。

答案 2 :(得分:0)

我有几点意见。

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

  2. 除了上述内容之外,看起来您已经尝试过这个Cypher查询,但看起来有些重复:

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

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

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