Как избежать создания дублирующих узлов, когда идентификатор не известен

Я использую 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 обеспечит соблюдение ограничений, и вам не нужно реализовывать уникальность на стороне сервера, так как база данных это делает.

У меня есть пара комментариев.

  1. Administrator кажется, значение name собственность, а не email имущество. Вы уверены, что 3 Administrator узлы в вашем изображении на самом деле имеют то же самое email стоимость имущества? Чтобы браузер neo4j показывал email значения, установите заголовок для Author узлы для email вместо name,

  2. Помимо вышесказанного, похоже, что вы уже пробовали этот запрос 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, но если вы хотите использовать его в качестве средства импорта данных, у вас есть несколько вариантов.

Во-первых, вы должны сами управлять раскладками клавиш. Конечно, это может быть нецелесообразно, в зависимости от объемов и других соображений. Второе - всегда пытаться извлечь данный объект из графика по его адресу электронной почты, прежде чем сохранять какой-либо элемент из вашего фида событий.

Другие вопросы по тегам