我正在使用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来持久/合并?
答案 0 :(得分:0)
其中一个最简单/最简单的解决方案是使用constraints:
Create CONSTRAINT ON (a:Author) ASSERT a.email IS UNIQUE
这样,neo4j将确保遵守约束,并且您不必在服务器端实现唯一性,因为数据库正在执行它。
答案 1 :(得分:0)
在ETL工具中,您可以合理地期望能够定义源密钥/身份。 Neo4j OGM并不是一个真正的ETL工具,但是如果你想将它用作数据导入器,你有几个选择。
首先是自己管理密钥映射。当然,这可能是不切实际的,取决于数量和其他考虑因素。第二种方法是在保存事件Feed中的任何项目之前,始终尝试通过其电子邮件地址从图表中获取给定对象。
答案 2 :(得分:0)
我有几点意见。
Administrator
似乎是name
属性的值,而不是email
属性。您确定图像中的3个Administrator
节点实际上具有相同的email
属性值吗?要使neo4j浏览器显示email
值set the caption,Author
节点显示为email
而不是name
。
除了上述内容之外,看起来您已经尝试过这个Cypher查询,但看起来有些重复:
MERGE (n:Author {name: {name}, email: {email}})
RETURN n
如果输入数据可能包含同一电子邮件地址的多个名称,则可以解释这一点。在这种情况下,以下查询应该防止"重复" Author
个节点。如果已存在具有参数化电子邮件地址的Author
(无论其name
值如何),则只返回现有节点(不更改其name
);否则,它会创建一个带有参数化Author
和email
属性的新name
节点。此解决方案意味着只有name
地址遇到的第一个email
将存储在数据库中。
MERGE (n:Author {email: {email}})
ON CREATE SET n.name = {name}
RETURN n