Neo4J 数据库的递归密码查询

问题描述 投票:0回答:1

想象一下有一个包含 3 个主节点的数据库:

  • 账号
  • 电邮
  • 电话号码

共享同一电子邮件的每个帐户都应该是唯一的。同样,共享相同电话号码的每个帐户都应该是唯一的。所以如果我们想拖出所有应该唯一的帐户,我们需要做这样的事情:

MATCH (:account) -[:has_email]-> (:account) -[:has_phone]-> -[:has_email]-> (:account) -> ...

查询永远持续下去。我们在 Neo4J 中有针对此类问题的内置解决方案吗?

非常感谢大家美好的一天。

neo4j cypher
1个回答
0
投票

我在下面创建了一些数据样本:

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                    │
    └────────┴─────────────────────┴─────────────────────┘
© www.soinside.com 2019 - 2024. All rights reserved.