【问题标题】:Using Neo4j to build a Master Data Management使用 Neo4j 构建主数据管理
【发布时间】:2015-12-06 17:31:42
【问题描述】:

我正在尝试使用 Neo4j 构建 MDM。我只是想用一些属性来模拟我们的客户数据库,比如电子邮件、documentNumber、地址、电话、手机等。

问题是我们的数据库太脏了。例如,我有具有相同 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>

所以我可以存储图表:(使用“密码”语言)

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 信息存储在两个不同的数据库中(维护)

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

【问题讨论】:

    标签: neo4j graph-databases master-data-management


    【解决方案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 可以处理大量节点,因为它们占用的空间非常小。

    当然,查询会变得更复杂一些。但另一方面,您必须在某处进行清理/重复数据删除,并且在查询时执行此操作可确保您不会丢失任何原始信息。它还让您可以灵活地更改/改进重复数据删除逻辑,甚至为每个用例设置不同的逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多