Neo4j欺诈检测Cypher查询:如何正确排除存在指定关系的节点
Neo4j欺诈检测:正确识别信用卡未关联自身银行账户的人员
问题根源
你之前的语句因为笛卡尔积问题导致误匹配:当用户拥有多个银行账户时,只要其中一个账户和信用卡无关联,这条组合就会被返回,哪怕该信用卡已经关联了用户的其他账户,所以才会出现“仍保留错误节点”的情况。
正确Cypher语句
根据你的需求,分两种场景提供语句:
场景1:找到存在至少一张信用卡未关联自身任何银行账户的用户
这类用户拥有银行账户和信用卡,且至少有一张信用卡完全没关联自己的银行账户:
MATCH (p:person)-[:NUTZT_KARTE]->(k:kreditkarte) WHERE EXISTS { (p)-[:HAT_KONTO]->(:bankkonto) } AND NOT EXISTS { MATCH (k)-[:VERKNUEPFT]->(b:bankkonto) WHERE (p)-[:HAT_KONTO]->(b) } RETURN p, k
场景2:找到所有信用卡都未关联自身任何银行账户的用户
这类用户的所有信用卡都没有绑定自己的银行账户:
MATCH (p:person) WHERE EXISTS { (p)-[:HAT_KONTO]->(:bankkonto) } AND EXISTS { (p)-[:NUTZT_KARTE]->(:kreditkarte) } AND ALL(k IN [(p)-[:NUTZT_KARTE]->(k) | k] WHERE NOT EXISTS { MATCH (k)-[:VERKNUEPFT]->(b:bankkonto) WHERE (p)-[:HAT_KONTO]->(b) }) RETURN p
语句说明
- 用
EXISTS {}子查询判断用户是否拥有银行账户/信用卡,同时精准检查信用卡是否关联了用户的任何银行账户,避免笛卡尔积干扰。 - 场景1适合排查存在异常卡的用户,场景2适合排查所有卡都异常的用户,可根据你的检测需求选择。
内容的提问来源于stack exchange,提问作者Karuzo Rodriguez
相关产品推荐
相关产品推荐

