使用Neo4j构建主数据管理系统

使用Neo4j构建主数据管理系统,neo4j,graph-databases,master-data-management,Neo4j,Graph Databases,Master Data Management,我正在尝试使用Neo4j构建MDM。我只是想用一些属性来模拟我们的客户数据库,比如电子邮件、文档号、地址、电话、手机等等 问题是我们的数据库太脏了。例如,我有具有相同documentNumber的用户(它类似于ssn)。当我查看这些登记处时,我可以看到他们实际上是同一个人 为了通过关系发现模式,我需要重复数据消除/清理记录。但我担心在重复记录时丢失信息 第一种方法: <customer> <name>Maria da Silva</name>

我正在尝试使用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>
然后我可以创建一个规范化/清理的节点:

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):

第一种方法:

<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>
(+)与第二种方法相比,它易于实现

(+)我将所有节点都放在一个数据库中

(-)节点数爆炸

(-)查询更复杂

第二种方法:

<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>
(+)它是干净和简单的查询

(-)MDM信息存储在两个不同的数据库中(维护)


(-)必须维护两个独立的数据库

我们通常采用第一种方法。类似于

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可以处理很多节点,因为它们占用的空间非常小

当然,查询会变得更复杂一些。但另一方面,您必须在某个地方进行清理/重复数据消除,在查询时这样做可以确保不会丢失任何原始信息。它还为您提供了更改/改进重复数据消除逻辑的灵活性,甚至为每个用例提供了不同的逻辑