次のクエリがあり、WITH で接続された 3 つの MATCHES があり、3 つのパスを検索しています。
MATCH (:File {name: 'A'})-[:FILE_OF]->(:Fun {name: 'B'})-->(ent:CFGEntry)-[:Flows*]->()-->(expr:CallExpr {name: 'C'})-->()-[:IS_PARENT]->(Callee {name: 'd'})
WITH expr, ent
MATCH (expr)-->(:Arg {chNum: '1'})-->(id:Id)
WITH id, ent
MATCH (entry)-[:Flows*]->(:IdDecl)-[:Def]->(sym:Sym)
WHERE id.name = sym.name
RETURN id.name
このクエリは、2 つの異なる ID と 1 つの異なるエントリ、および 7 つの異なる sym を返します。
問題は、2 番目の MATCH で「WITH id, entry」を渡し、2 つの異なる ID が見つかったため、エントリの 2 つのインスタンスが 1 ではなく 3 番目の一致に渡され、3 番目の一致の実行時間が不必要に 2 倍になることです。少なくとも。
エントリの 1 つのインスタンスだけを使用するために、このクエリをどのように記述すればよいか知っている人がいるかどうか疑問に思っています。
ID を集約するのが最善の策ですが、それに応じてクエリの 3 番目の部分でロジックを調整する必要があります。
MATCH (:File {name: 'A'})-[:FILE_OF]->(:Fun {name: 'B'})-->(ent:CFGEntry)-[:Flows*]->()-->(expr:CallExpr {name: 'C'})-->()-[:IS_PARENT]->(Callee {name: 'd'})
WITH expr, ent
MATCH (expr)-->(:Arg {chNum: '1'})-->(id:Id)
WITH collect(id.name) as names, ent
MATCH (entry)-[:Flows*]->(:IdDecl)-[:Def]->(sym:Sym)
WHERE sym.name in names
RETURN sym.name
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加