【问题标题】:Neo4j Cypher exclude nodes where a specific relationship is missingNeo4j Cypher 排除缺少特定关系的节点
【发布时间】:2022-11-21 00:13:15
【问题描述】:

我正在尝试在 neo4j 中实施欺诈检测系统,其中我有一堆节点,包括个人、银行账户、信用卡、电话号码和地址。

检测银行系统欺诈的一个基本思路是某人拥有一个银行账户和一张信用卡,而他的信用卡与他自己的银行账户没有关联。

我不知道该怎么做。因为当我尝试排除这些节点时: WHERE NOT (k)-[:VERKNUEPFT]-(b) 我仍然得到错误的节点,但它只是隐藏了 VERKNUEPFT 节点。

有人能给我正确的否定方法,排除每个不需要的节点吗?

所以简单地说我需要得到以下输出:

首先,我过滤掉了所有需要的节点: MATCH (p:person)-[r:HAT_KONTO]->(b:bankkonto), (p)-[r2:NUTZT_KARTE]->(k:kreditkarte) return p,b,k,r,r2; 这给了我以下内容: 这个 Hermine 和 Ron 下面的节点是正确的,所以我想排除所有与他们链接的人。

但是当我尝试做MATCH (p:person)-[r:HAT_KONTO]->(b:bankkonto), (p)-[r2:NUTZT_KARTE]->(k:kreditkarte) WHERE NOT (k)-[:VERKNUEPFT]-(b) return p,b,k,r,r2;

我得到以下信息:

只有bankaccount(棕色的)不见了。

当我使用 WHERE 而不是 WHERE NOT 测试相同的代码时: MATCH (p:person)-[r:HAT_KONTO]->(b:bankkonto), (p)-[r2:NUTZT_KARTE]->(k:kreditkarte) WHERE (k)-[:VERKNUEPFT]-(b) return p,b,k,r,r2;

我实现了与我想要的相反的结果。

【问题讨论】:

    标签: neo4j cypher relation negation fraud-prevention


    【解决方案1】:

    我认为你需要检查一个人持有的所有信用卡是否都与他的任何一个银行账户相关联。目前,您正在检查它们是否链接到特定银行。沿着这些方向尝试一些事情:

    MATCH (p:person)-[:HAT_KONTO]->(b:bankkonto)
    WITH p, collect(b) AS banks
    MATCH (p)-[r2:NUTZT_KARTE]->(k:kreditkarte)
    WITH p, banks, collect(k) AS creditCards 
    WHERE ALL(card IN creditCards WHERE ANY(bank IN banks WHERE (card)-[:VERKNUEPFT]-(bank)))
    UNWIND banks AS b
    UNWIND creditCards AS k
    MATCH (p)-[r:HAT_KONTO]->(b), (p)-[r2:NUTZT_KARTE]->(k)
    RETURN p,r,b,r2,k
    

    在上面的查询中,我们首先将与一个人关联的银行及其信用卡收集到两个不同的集合中。然后,我们检查是否所有的信用卡都链接到其中一家银行,以过滤掉有效用户。然后我们返回他们的详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多