通过属性相等来匹配多个实体的正确方法是什么?

问题描述

我有以下几种实体和属性

  • Linkedin公司
  • Facebook
    • facebook_url
    • 名称
    • website_url
    • 电话
  • 网站
    • linkedin_url
    • facebook_url
    • 电话

并非所有实体都填充了其所有属性

我想创建一个统一的数据集,该数据集将基于所有实体之间匹配的对应值

我正在考虑使用graphdb,尤其是neo4j

但是,如果每个实体都是一个节点,那么我将不得不通过编程检查每个属性与所有其他实体中对应属性相等性来创建每种关系。

我也考虑使用某种sql连接,但是在数据模型扩展时维护它似乎很困难。

解决此问题的写方法是什么?

哪种技术最适合?

解决方法

这是在neo4j中执行此操作的一种方法。 (Stackoverflow并不是询问做某事的“最佳”技术的正确位置,因为这往往是非常主观的。)

您可以创建唯一的URLPhonePersonAccount节点,并将每个Account连接到适当的URLPhonePerson节点。

例如,假设您的3个示例帐户与同一个人相关,则可以在数据库中表示该示例:

MERGE (pe:Person {name: 'Jane Doe'})
MERGE (ac_li:Account {type: 'li',id: 'xyz'})
MERGE (ac_fb:Account {type: 'fb',id: 'abc'})
MERGE (ac_si:Account {type: 'site',id: 'foo'})
MERGE (url_li:URL {type: 'li',url: 'http://example.net/xyz'})
MERGE (url_fb:URL {type: 'fb',url: 'http://example.com/abc'})
MERGE (url_si:URL {type: 'site',url: 'http://example.org/foo'})
MERGE (ph:Phone {number: '1234567890'})

MERGE (pe)-[:ACCOUNT]->(ac_li)
MERGE (pe)-[:ACCOUNT]->(ac_fb)
MERGE (pe)-[:ACCOUNT]->(ac_si)
MERGE (ac_li)-[:PHONE]->(ph)
MERGE (ac_fb)-[:URL]->(url_fb)
MERGE (ac_fb)-[:URL]->(url_si)
MERGE (ac_fb)-[:PHONE]->(ph)
MERGE (ac_si)-[:URL]->(url_li)
MERGE (ac_si)-[:URL]->(url_fb)

然后,如果要查找与特定URL相关的所有AccountPerson组合,则可以执行以下操作:

MATCH (url:URL)<-[:URL]-(account)<-[:ACCOUNT]-(person)
WHERE url.url = 'http://example.com/abc'
RETURN account,person