Как избежать создания дублирующих узлов, когда идентификатор не известен
Я использую Neo4J для сохранения событий из веб-хитов Git-lab. Пример данных можно найти здесь https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/web_hooks/web_hooks.md#push-events Один из узлов - это Author {name, Эл. адрес}
Здесь электронная почта является естественным уникальным идентификатором. В Hibernate(JPA) есть аннотация @Id, которую я мог бы установить в поле "Автор" по электронной почте ( см. Документацию). Как я могу заставить Neo4J OGM сохранять / объединять на основе электронной почты вместо ее идентификатора?
3 ответа
Одним из самых быстрых / простых решений было бы использование ограничений:
Create CONSTRAINT ON (a:Author) ASSERT a.email IS UNIQUE
Таким образом, neo4j обеспечит соблюдение ограничений, и вам не нужно реализовывать уникальность на стороне сервера, так как база данных это делает.
У меня есть пара комментариев.
Administrator
кажется, значениеname
собственность, а неemail
имущество. Вы уверены, что 3Administrator
узлы в вашем изображении на самом деле имеют то же самоеemail
стоимость имущества? Чтобы браузер neo4j показывалemail
значения, установите заголовок для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
В инструменте ETL вы разумно ожидаете, что сможете определить ваши исходные ключи / идентификационные данные. Neo4j OGM на самом деле не является инструментом ETL, но если вы хотите использовать его в качестве средства импорта данных, у вас есть несколько вариантов.
Во-первых, вы должны сами управлять раскладками клавиш. Конечно, это может быть нецелесообразно, в зависимости от объемов и других соображений. Второе - всегда пытаться извлечь данный объект из графика по его адресу электронной почты, прежде чем сохранять какой-либо элемент из вашего фида событий.