如何使用多个关系和具有多个节点的路径来简化我的密码

问题描述 投票:0回答:2
match p=(a:ACCT_NO)
-[r1:TRX_TO]-(n1:ACCT_NO)
-[r2:TRX_TO]-(n2:ACCT_NO)
-[r3:TRX_TO]-(n3:ACCT_NO)
-[r4:TRX_TO]-(b:ACCT_NO)
-[rb:BELONG_TO]->(c1:CUSTOM_NO{sensitivity:'1'})
-[:RELATE_TO*0..2]-(c2:CUSTOM_NO)
where r1.trxAmt > 10000 and r2.trxAmt > 10000 and r3.trxAmt > 10000 and r4.trxAmt > 10000
and a.acctNo in $doubtAcct
and not n1.acctNo in $fliterAcct
and not n2.acctNo in $fliterAcct
and not n3.acctNo in $fliterAcct
return p;

我想找到a和b之间的路径,但在路径中,$ fliterAcct和trxAmt列表中没有节点,关系属性大于10000。

我的问题是如何简化我的密码?因为我不想找到n1,n2,n3和r1,r2,r3的路径,如果我需要搜索几个关系。是否我可以使用[r:TRX_TO * ... 3]这样的模式(实际上我尝试,但错误是类型不匹配:预期任何,地图,节点或关系但是列表(第2行,第7列(偏移量:54) ))“其中r.trxAmt> 10000”)

neo4j cypher
2个回答
0
投票

这是一个简化的查询:

MATCH p = (a:ACCT_NO)-[rels:TRX_TO*4]-(:ACCT_NO)-[:BELONG_TO]->(:CUSTOM_NO{sensitivity:'1'})-[:RELATE_TO*0..2]-(:CUSTOM_NO)
WHERE a.acctNo in $doubtAcct AND
  ALL(r IN rels WHERE r.trxAmt > 10000) AND
  NONE(n IN NODES(p)[1..3] WHERE n.acctNo in $fliterAcct)
RETURN p;

[EDITED]

或者,由于可变长度关系的标识符的使用是deprecated since version 3.2,您可以这样做:

MATCH p = (a:ACCT_NO)-[:TRX_TO*4]-(:ACCT_NO)-[:BELONG_TO]->(:CUSTOM_NO{sensitivity:'1'})-[:RELATE_TO*0..2]-(:CUSTOM_NO)
WHERE a.acctNo in $doubtAcct AND
  ALL(r IN RELATIONSHIPS(p)[0..3] WHERE r.trxAmt > 10000) AND
  NONE(n IN NODES(p)[1..3] WHERE n.acctNo in $fliterAcct)
RETURN p;

0
投票

您处于正确的轨道上,可变长度模式是正确的方法,但您需要使用不同的方法来确保所有节点和关系都符合您想要的限制。

match p=(a:ACCT_NO)-[:TRX_TO*4]-(b:ACCT_NO)-[rb:BELONG_TO]->(c1:CUSTOM_NO{sensitivity:'1'})-[:RELATE_TO*0..2]-(c2:CUSTOM_NO)
where a.acctNo in $doubtAcct and all(rel in relationships(p) where type(rel) <> 'TRX_TO' OR r.trxAmt > 10000)
 and none(node in nodes(p) where node in $fliterAcct)
return p;
© www.soinside.com 2019 - 2024. All rights reserved.