想象一下有一个包含 3 个主节点的数据库:
共享同一电子邮件的每个帐户都应该是唯一的。同样,共享相同电话号码的每个帐户都应该是唯一的。所以如果我们想拖出所有应该唯一的帐户,我们需要做这样的事情:
MATCH (:account) -[:has_email]-> (:account) -[:has_phone]-> -[:has_email]-> (:account) -> ...
查询永远持续下去。我们在 Neo4J 中有针对此类问题的内置解决方案吗?
非常感谢大家美好的一天。
我在下面创建了一些数据样本:
CREATE (a1:Account {name:'acct1'}),
(a2:Account {name:'acct2'}),
(a3:Account {name:'acct3'}),
(e1:Email),
(e2:Email),
(e22:Email),
(e3:Email),
(p1:Phone),
(p2:Phone),
(p3:Phone),
(p32:Phone),
(a1)-[:has_email]->(e1),
(a1)-[:has_phone]->(p1),
(a2)-[:has_email]->(e2),
(a2)-[:has_email]->(e22),
(a2)-[:has_phone]->(p2),
(a3)-[:has_email]->(e3),
(a3)-[:has_phone]->(p3),
(a3)-[:has_phone]->(p32)
以下是获取所有具有非唯一电子邮件或电话的帐户的查询。
MATCH (a:Account)-[:has_email]-(e:Email), (a)-[:has_phone]-(p:Phone)
WITH a, size(collect(distinct e)) as ecnt, size(collect(distinct p)) as pcnt
WHERE ecnt>1 or pcnt>1
RETURN a.name, ecnt as duplicate_email_cnt, pcnt as duplicate_phone_cnt
应该返回 account2(重复的电子邮件)和 account2(重复的电话)
样本结果:
╒════════╤═════════════════════╤═════════════════════╕
│"a.name"│"duplicate_email_cnt"│"duplicate_phone_cnt"│
╞════════╪═════════════════════╪═════════════════════╡
│"acct2" │2 │1 │
├────────┼─────────────────────┼─────────────────────┤
│"acct3" │1 │2 │
└────────┴─────────────────────┴─────────────────────┘