2017-12-01 3 views
1

私は、cypherを使用してneo4jで一連のデータノードを維持しようとしています。 私は現在の日付とタイムスタンプを持つノードを作成しています。また、最新のノードと最新のノードとの間に接続を作成する必要があります。 ノードが既に存在するかどうかチェックして、最新の日付のノードを取得し、 (latest:Node)<-[:next]-(prev:Node)を作成する必要があります。 ノードが存在しない場合は、現在の日付のノードを作成するだけです。 ありがとう最新の日付を持つneo4jノード(存在する場合)を取得し、現在のノードとの接続を作成するにはどうすればよいですか?

+0

作成する前に確認した内容について詳細を共有できますか?基本的に、私はどこかに 'OPTIONAL MATCH(x:SomeLabel)の行に沿ってxがどこにあるのかxはNULLではありません... ' –

答えて

3

最新のノードを指している何らかの種類のヘッドノードがある場合は、これを維持する方が簡単です。これは、リストに含まれるノードの数にかかわらず、最新のノードを高速に見つけるのに役立つだけでなく、このリストに対する同時変更の調整にも役立ちます。

と仮定しましょう:最新のノードとの最新の関係を持つヘッドノードを考えてみましょう。同時クエリが実行されているときに競合状態を避けるために、最新のノードをチェックする前に:Headノードをロックする必要があります。

これを行う最も簡単な方法は、APOC Procedurescall apoc.lock.nodes()です。

// assume `latest` node with latest timestamp is already created and in scope 
WITH latest 
MATCH (head:Head) 
CALL apoc.lock.nodes([head]) // avoid race conditions 
OPTIONAL MATCH (head)-[r:LATEST]->(prev) 
WITH latest, head, r, prev // this + the WHERE needed to halt query if latest isn't newer than prev 
WHERE COALESCE(prev.timestamp, 0) < latest.timestamp 
DELETE r // update :LATEST relationship 
MERGE (head)-[:LATEST]->(latest) 
WITH latest, prev 
WHERE prev IS NOT NULL // protects from error in case when prev is null 
MERGE (latest)<-[:next]-(prev) 

は、新しく作成されたノードが今最も最近のノードであるとき、これは動作しますが、それはprevより新しいないノードのために動作しないことに注意してください。この場合、それらはリストに追加されません。リスト内の適切な場所にノードを挿入するためにクエリを変更する必要があります。

+0

ありがとう! 1回目のノードを作成する場合、つまり前のノード(最新)が存在しない場合はどうなりますか?また、多くのノードが存在しないので、複雑さは問題ではありません。 Thanks – Neo

+0

前のノードがなくてもクエリーが動作するはずです。試してみてください(ヘッドノードが必要です: – InverseFalcon

+0

ありがとう#InverseFalcon)。 – Neo

関連する問題