Neo4jの関係プロパティを効率的に一括更新するのに苦労しています。目的は、私は、単一のサイファーステートメント、Neo4jでのパフォーマンスの一括更新の関係プロパティ
UNWIND {rows} AS row
MATCH (s:Entity) WHERE s.uuid = row.source
MATCH (t:Entity) WHERE t.uuid = row.target
MATCH (s)-[r:CONSUMED]->(t)
SET r += row.properties
1,000と処理のバッチにチャンクが千個のノードの各バッチは、約60秒かかり〜50万関係(おおよそ3特性を有する各々)を更新することです。私が以前に実行したすなわち:Entity
ラベルのUUIDプロパティのインデックス、関係をマッチングはクエリプランごとの超効率的であることを意味
CREATE INDEX ON :Entity(uuid)
、
ありますが存在します合計6回のヒットとなり、照会は〜150ミリ秒で実行されます。私も各試合は一つだけの要素を返すことが保証さUUID財産上の一意性制約を追加しました、
CREATE CONSTRAINT ON (n:Entity) ASSERT n.uuid IS UNIQUE
誰もが、私はさらにそれがのNeo4jを取っている理由を理解するために関係を処理する限り、これをデバッグする方法を知っています?
私はノードを更新するのに似たロジックを使用していますが、それよりもはるかに速く、より多くのメタデータが関連付けられています。
参考までに、私はNeo4j 3.0.3、py2neo、Boltを使用しています。 Pythonコードブロックの形式である、
for chunk in chunker(relationships): # 1,000 relationships per chunk
with graph.begin() as tx:
statement = """
UNWIND {rows} AS row
MATCH (s:Entity) WHERE s.uuid = row.source
MATCH (t:Entity) WHERE t.uuid = row.target
MATCH (s)-[r:CONSUMED]->(t)
SET r += row.properties
"""
rows = []
for rel in chunk:
rows.append({
'properties': dict(rel),
'source': rel.start_node()['uuid'],
'target': rel.end_node()['uuid'],
})
tx.run(statement, rows=rows)