を行うには正しい方法である私は私のCYPHERクエリをこのように束ねて逃しています任意の明白な最適化はありますか?
はい。問題のクエリは、クエリオプティマイザと実行エンジンの仕事を非常に困難にします。 WebブラウザにアクセスしてEXPLAIN
というクエリプランを実行すると、このクエリプランにはエンジンが処理するために作られたものではない巨大なタプルが必要であることが示されます。
一般に、ノードをループしてバンドルするよりもリレーションを作成するのがよいでしょうか?
ループオーバーが良い方向です。
はUWIND
それをドライバーに単一のパラメータとして[startNode, endNode, relationshipProperties]
トリプルのコレクションをパスし、:実際には、あなたが作ることができるいくつかの最適化があります。
SET relationship_variable = map_variable
constructを使用して、関係のプロパティを初期化します。
オプションで、collect
メソッドを使用して結果のIDをリストに戻すことができますが、通常はドライバが反復可能な結果を返すため、これは必要ありません。
これらのトリックは、このクエリによって組み込まれる:クライアント側で
UNWIND $rels AS rel
WITH
rel[0] AS startNodeId,
rel[1] AS endNodeId,
rel[2] AS relationshipProperties
MATCH (startNode:SomeLabel), (endNode:SomeLabel)
WHERE ID(startNode) = startNodeId
AND ID(endNode) = endNodeId
CREATE (startNode)-[r:`ParameterValue`]->(endNode1)
SET r = relationshipProperties
WITH collect(ID(r)) AS relationshipIds
RETURN relationshipIds
、あなたはStatementRunner.run(statementTemplate, statementParameters)
methodでパラメータを渡す必要があります。単一のキーがrels
のマップと3要素リストのリストです。
Map<String, Object> parameters =
ImmutableMap.of("rels",
ImmutableList.of(
ImmutableList.of(1, 2, ImmutableMap.of("prop1", "value1", "prop2", false)),
ImmutableList.of(3, 4, ImmutableMap.of(...)),
...
)
);
StatementRunner.run("UNWIND ...", parameters);
注1.サイファー言語を使用して、パラメータとして、ノードとの関係を渡すことができます:あなたは、グアバのimmutable collectionsは、例えば、優れたコレクションライブラリを使用して簡潔な方法でこれを表現することができます。しかし、これは組み込みバージョンとnot in the client-server setupでしか動作しないので、IDを渡す方がよいでしょう。
注2.内部IDの受け渡しは実用的ではありません。ほとんどのプロトタイプでうまく動作しますが、それらの使用を避け、独自の識別子を提供することを検討することをお勧めします。 Best and Worst Practices with Node IDsを参照してください。
注3.トリプルを使用する代わりに、マップを使用して作成する関係を表すこともできます。このように、あなたはJavaから地図として渡す、つまり、あなたのリストは、マップで構成されます:
ImmutableMap.of("startNode", 1, "endNode", 2, "relationshipProperties", ImmutableMap.of("prop1", "value1", "prop2", true))
次にあなたがrel.startNode
、rel.endNode
とrel.relationshipProperties
などの値を参照することができます。これにより、クエリの読みやすさと保守性が少し向上しますが、通常は面倒なことではありません。
ありがとうございます!これは知っておくべき素晴らしい情報であり、試してみるとパフォーマンスに戻ってきます。 – Kirin
ソリューションを実装した後に更新します。関係の作成時間を15秒から0.2秒に短縮できました。ソリューションと他のポインターについてもありがとうございました。 – Kirin