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&#34)
答案 0 :(得分: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;
答案 1 :(得分: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;