2017-01-04 3 views
1

こんにちは、ノードとリレーションシップを作成/マージする際に次のエラーが発生します。それは必ずしも起こるとは限りませんが、しばらくして起こります。Neo4j-Python Connectorを使用してグラフを作成/マージする際のCypherError

CypherError: An unexpected failure occurred, see details in the database logs, reference number eaf50bff-deca-4055-9450-6a76c31534e4.

これはトレースバックです:作成/マージのため

--------------------------------------------------------------------------- 
CypherError        Traceback (most recent call last) 
<ipython-input-21-9700f3a5d3fa> in <module>() 
     7  tx.success = True 
     8  #tx.close() 
----> 9 session.close() 

/databricks/python/local/lib/python2.7/site-packages/neo4j/v1/session.pyc in close(self) 
    522   """ 
    523   if self.last_result: 
--> 524    self.last_result.buffer() 
    525   if self.transaction: 
    526    self.transaction.close() 

/databricks/python/local/lib/python2.7/site-packages/neo4j/v1/session.pyc in buffer(self) 
    246   if self.connection and not self.connection.closed: 
    247    while not self._consumed: 
--> 248     self.connection.fetch() 
    249    self.connection = None 
    250 

私のコードはこれです:

for chunk in chunk_list: 
    with session.begin_transaction() as tx: 
    for record in chunk: 
     tx.run("MERGE (source:UID {userid : {m}, timestamp: {a}})" 
      "MERGE (target:UID {userid : {n}, timestamp: {a}})" 
      "MERGE (source)-[:HasConnection]-(target)", {"m": record.source, "n": record.target, "a": record.unix_timestamp_s}) 
    tx.success = True 
    #tx.close() 
    session.close() 

chunk_listは、レコードの複数のリストを含むリストです。 chunk_list内の各リストには複数の行(約10000)があり、各行にはソース、ターゲット、タイムスタンプの3つの列が含まれています。

chunk_list内の各リストについて、セッションを開いてからマージ操作を行ってからセッションを閉じます。

グラフが1000万ノードを超えると問題が発生します。 1日目はchunk_listに400万行があり、chunk_listに400万行があれば2日目に問題なく動作します。しかし、3日目に300万行があり、Neo4jグラフでノードの総数が1000万を超える場合、問題が発生し始めます。

+1

UIDノードをuseridとtimestampの両方でマージしているので、userid + timestampの組み合わせがUIDのユニークな検索キーであることを訂正します。つまり、複数のUIDが存在する可能性があります。タイムスタンプ?または、useridがユニークなルックアップキーで、タイムスタンプを更新して接続を作成しようとしていますか? – InverseFalcon

+0

同じユーザーIDである必要がありますが、マージ操作中にタイムスタンプが変更されます。 @InverseFalcon – sjishan

答えて

0

データベースが記録されたディスクスペースを使い果たしたので、それは起こりましたログに記録する。

1

これは実行に時間がかかる理由の1つは、クエリが自分が行っていると思われることをしていないことです。

MERGEを実行することは、MATCHを最初に実行しようとするようなもので、一致するものが見つからない場合はCREATEを実行するようなものです。

あなたのコメントでは、MERGE操作中にタイムスタンプが変更する必要があると言いました。本当にやりたいことは、同じユーザーIDを持つノードのプロパティの更新ですが、それはあなたのMERGEがやっていることではありません。

あなたのMERGEは、指定されたユーザIDとタイムスタンプを持つUIDノードを最初にマッチしようとしていますが、タイムスタンプが新しくなっているので、そのノードはあなたのグラフにはありません... UIDノード同じユーザーIDを持つが、タイムスタンプが異なるため、一致するものは見つからず、新規のUIDノードが既存のノードと同じユーザーIDで作成され、新しいタイムスタンプが作成されます。

あなたのMERGEは常に新しいノードを作成し、既存のノードでは決して一致しません。 MERGE自体はプロパティ値を更新することはありませんので、決してその方法で使用しようとはしません。

一致し、更新を実行するには、既存のノードに一致させるために最低限のユニークな特性に基づいてMERGE、その後、プロパティを更新するには、SETを使用して、次のようにする必要があります。

for chunk in chunk_list: 
    with session.begin_transaction() as tx: 
    for record in chunk: 
     tx.run("MERGE (source:UID {userid : {m}})" 
      "SET source.timestamp = {a}" 
      "MERGE (target:UID {userid : {n}})" 
      "SET target.timestamp = {a}" 
      "MERGE (source)-[:HasConnection]-(target)", {"m": record.source, "n": record.target, "a": record.unix_timestamp_s}) 
    tx.success = True 
    #tx.close() 
    session.close() 

また、あなたのMERGEが高速であることを保証するためには、UID(userid)にインデックスまたはユニーク制約を設定する必要があります。そうしないと、neo4jはノードを見つけるためにラベルスキャンを行う必要があります。グラフ。

EDIT

私はまだのNeo4jにはPythonを使用していないが、私はそれがコピーの巨大なハンバーを実行するように見えるように、ループのこの種は、複数のレコードを処理する正しい手段であるか分かりません指定されたCypherセグメントのCypherの5行の行は極端なようです...理想的には、すべての行を同時に(または少なくとも1つのチャンクごとに)操作するためには、入力を簡単に実行用の行に変換するためにCypherコードを使用する必要があります。

ループを使用してオブジェクトのリスト( "m"および "n"プロパティを含む)を生成し、リストと単一のタイムスタンプをパラメータとしてクエリに送信する方がよい場合があります。

これで、Cypher内のリストを行に戻して、それを使用することができます。 「行」は、オブジェクトパラメータのリストで、「」あなたのUnixタイムスタンプパラメータ残って、サイファー・セグメントは次のようになりますのであれば、:

UNWIND {row} as line 
MERGE (source:UID {userid : line.m}) 
SET source.timestamp = {a} 
MERGE (target:UID {userid : line.n}) 
SET target.timestamp = {a} 
MERGE (source)-[:HasConnection]-(target) 
+0

訂正していただきありがとうございます。問題はディスク容量に関連していました。 – sjishan

+0

私の答えを編集して、Cypherトランザクションを生成するためにループを使用する方法が、これに近づく正しい方法ではない可能性があることを指摘しました。 – InverseFalcon

関連する問題