Использование Neo4j для построения управления основными данными

Я пытаюсь использовать Neo4j для создания MDM. Я просто пытаюсь смоделировать нашу базу данных клиентов с некоторыми свойствами, такими как электронная почта, номер документа, адрес, телефон, мобильный телефон и так далее.

Проблема в том, что наша база данных слишком грязная. Например, у меня есть пользователи с одинаковым documentNumber (это как ssn.). И когда я смотрю на эти реестры, я вижу, что на самом деле это один и тот же человек.

Для обнаружения паттерна через отношения мне нужно дедуплицировать / чистить записи. Но я боюсь потерять информацию, когда делаю записи.

Первый подход:

<customer>
    <name>Maria da Silva</name>
    <document>108518037-92</document>
    <phone>
        <areaCode>21</areaCode>
        <number>2247223A<number>
    <phone>
</customer>

<customer>
    <name>Maria da S.</name>
    <document>10851803792</document>
    <phone>
        <areaCode>21</areaCode>
        <number>2247-2236<number>
    <phone>
</customer>

Так что я мог бы сохранить график: (используя язык "cypher")

person1:Person {name:"Maria da Silva", document:"108518037-92"}
phone1:Phone {areaCode:"21", number:"2247223A"}
person1-[owns]->phone1

person2:Person {name:"Maria da S", document:"10851803792"}
phone2:Phone {areaCode:"21", number:"2247-2236"}
person2-[owns]->phone2

И тогда я мог бы создать нормализованные / очищенные узлы:

person_mdm:PersonMdm {name:"MARIA DA SILVA", document:"10851803792"} // now i have to choose a name
phone_mdm:PhoneMdm {areaCode:"21", number:"22472236"} // and choose a phone too

и затем свяжите исходные узлы с нормализованными узлами:

person_mdm-[references]->person1
person_mdm-[references]->person2

phone_mdm-[references]->phone1
phone_mdm-[references]->phone2
person_mdm-[owns]->phone_mdm

Второй подход

Сохраните узлы mdm со списком свойств, содержащих хэши. Эти хэши ссылаются на запись в другой базе данных (например, MongoDB):

person_mdm:PersonMdm {name:"MARIA DA SILVA", document:"10851803792", hash:[XXX, YYY]}
phone_mdm:PhoneMdm {areaCode:"21", number:"22472236", hash: [ZZZ, KKK]} 
person_mdm-[owns]->phone_mdm

Первый подход:

(+) Его легко реализовать по сравнению со вторым подходом

(+) У меня будут все узлы в одной базе данных

(-) Количество узлов взрыва

(-) Запросы более сложные

Второй подход:

(+) Это простой и понятный запрос

(-) Информация MDM хранится в двух разных базах данных (обслуживание)

(-) Необходимо поддерживать две отдельные базы данных

1 ответ

Мы обычно идем на первый подход. Нечто подобное

person1:Person {name:"Maria da Silva", document:"108518037-92"}
phone1:Phone {areaCode:"21", number:"2247223A"}
person1-[:OWNS]->phone1

person2:Person {name:"Maria da S", document:"10851803792"}
phone2:Phone {areaCode:"21", number:"2247-2236"}
person2-[:OWNS]->phone2

person1-[:SAME_AS]->person2

Я не буду беспокоиться о количестве узлов, если у вас нет миллиардов. Neo4j может обрабатывать множество узлов, поскольку они занимают очень мало места.

Запросы становятся немного сложнее, конечно. Но, с другой стороны, вам нужно где-то выполнить очистку / дедупликацию, и выполнение этого во время запроса гарантирует, что вы не потеряете исходную информацию. Это также дает вам гибкость для изменения / развития логики дедупликации или даже для использования другой логики для каждого варианта использования.

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