2017-02-03 4 views
0

新しくNeo4jに新しいといくつかのガイダンスを探しています:-)Cypher LOAD CSV - プロパティによって順序付けられたノードのリンクリストを作成する方法は?

基本的に以下のcsvからグラフを作成します。 NEXT関係は、プロパティの順序に基づいてポイント間に作成されますシーケンスシーケンスが連続している場合は、無視したいと思います。何か案は?

(S1:形状) - [:POINTS] - >(P1:ポイント)

(S1:形状) - [:POINTS] - >(P2:ポイント)

(S1:シェイプ) - [:POINTS] - >(P3:ポイント)

(P1) - [:NEXT] - >(P2)

(P2):NEXT] - >(P3)

など

shape_id,shape_pt_lat,shape_pt_lon,shape_pt_sequence,shape_dist_traveled 
"1-700-y11-1.1.I","53.42646060879","-6.23930113514121","1","0" 
"1-700-y11-1.1.I","53.4268571616632","-6.24059395687542","2","96.6074531286277" 
"1-700-y11-1.1.I","53.4269700485041","-6.24093540883784","3","122.549696670773" 
"1-700-y11-1.1.I","53.4270439028769","-6.24106779537932","4","134.591291249566" 
"1-700-y11-1.1.I","53.4268623569266","-6.24155684094256","5","172.866609667575" 
"1-700-y11-1.1.I","53.4268380666968","-6.2417384245122","6","185.235926544428" 
"1-700-y11-1.1.I","53.4268874080753","-6.24203735638874","7","205.851454672516" 
"1-700-y11-1.1.I","53.427394066848","-6.24287421729846","8","285.060040065768" 
"1-700-y11-1.1.I","53.4275257974236","-6.24327509689195","9","315.473852717259" 
"1-700-y11-1.2.O","53.277024711771","-6.20739084216546","1","0" 
"1-700-y11-1.2.O","53.2777605784999","-6.20671521402849","2","93.4772699644143" 
"1-700-y11-1.2.O","53.2780318605927","-6.2068238246152","3","124.525619356934" 
"1-700-y11-1.2.O","53.2786209984572","-6.20894363498438","4","280.387737910482" 
"1-700-y11-1.2.O","53.2791038678913","-6.21057305710353","5","401.635418300665" 
"1-700-y11-1.2.O","53.2790975844245","-6.21075327761739","6","413.677012879457" 
"1-700-y11-1.2.O","53.2792296384738","-6.21116766400758","7","444.981964564454" 
"1-700-y11-1.2.O","53.2799500357098","-6.21065767664905","8","532.073870043666" 
"1-700-y11-1.2.O","53.2800290799386","-6.2105343995296","9","544.115464622458" 
"1-700-y11-1.2.O","53.2815594673093","-6.20949562301196","10","727.987702875002" 

私はできない3番目の部分です。 NEXT関係を作成する!

//1. Create Shape 
USING PERIODIC COMMIT 10000 
LOAD CSV WITH HEADERS FROM 
'file:///D:\\shapes.txt' AS csv 
With distinct csv.shape_id as ids 
Foreach (x in ids | merge (s:Shape {id: x})); 

//2. Create Point, and Shape to Point relationship 
USING PERIODIC COMMIT 10000 
LOAD CSV WITH HEADERS FROM 
'file:///D:\\shapes.txt' AS csv 
MATCH (s:Shape {id: csv.shape_id}) 
with s, csv 
MERGE (s)-[:POINTS]->(p:Point {id: csv.shape_id, 
lat : csv.shape_pt_lat, lon : csv.shape_pt_lat, 
sequence : toInt(csv.shape_pt_sequence), dist_travelled : csv.shape_dist_traveled}); 

//3.Create Point to Point relationship 
USING PERIODIC COMMIT 10000 
LOAD CSV WITH HEADERS FROM 
'file:///D:\\shapes.txt' AS csv 
??? 

答えて

1

この場合、APOC Proceduresがインストールされます。バッチ処理の手段と、コレクション内のすべてのノードをすばやくリンクする手段の両方を備えています。

あなたはすでにシェイプの形をデータベースに持っているので、別のロードCSVを行う必要はありません。ちょうどあなたが持っているデータを使用してください。

apoc.periodic.iterate()を使用して各形状をバッチ処理し、apoc.nodes.link()を使用して、形状内のすべての順序付けられた点を関係でリンクします。

CALL apoc.periodic.iterate(
    "MATCH (s:Shape) RETURN s", 
    "WITH {s} as shape 
    MATCH (shape)-[:POINTS]->(point:Point) 
    WITH shape, point 
    ORDER by point.sequence ASC 
    WITH shape, COLLECT(point) as points 
    CALL apoc.nodes.link(points,'NEXT')", 
    {batchSize:1000, parallel:true}) YIELD batches, total 
    RETURN batches, total 

EDIT

手順を使用してapoc.periodic.iterate内で呼び出したとき何の変異操作は(は、第二の部分におけるSET操作を含めた後、これを試み発生しない場合)(バグがあるかもしれないように見えますいくつかのノードでプロパティを設定するためのクエリでは、プロパティは追加されませんでした)。

プロシージャ・コール内で実行されるプロシージャ・コールの一般的なケースか、apoc.periodic.iterate()に固有のものか、iterate()とlink()の両方でのみ発生するかどうかわかりません。

原因について詳細を知ることができれば、バグを報告します。その間、バッチ処理が不要な場合は、apoc.periodic.iterate()を省略することができます。

MATCH (shape:Shape)-[:POINTS]->(point:Point) 
    WITH shape, point 
    ORDER by point.sequence ASC 
    WITH shape, COLLECT(point) as points 
    CALL apoc.nodes.link(points,'NEXT') 
+1

何らかの理由で、関係は作成されません。正しいバッチ数を正しく返します。 apoc.perioidic.iterateは私が想定している変更をコミットします!多分apoc.perioidic.iterateの中で別のプロシージャを呼び出すことはできませんか?これは正常に実行されましたが、バッチ処理されませんでした。MATCH(s:Shape) WITH MATCH(s) - [:POINTS] - >(point:Point) WITH s、ポイント ORDER by point.sequence ASC WITH s、COLLECT(ポイント)をポイントとして CALL apoc.nodes.link(ポイント、 'NEXT') return s; – Robatron

+0

興味深い発見、私もこれを複製することができました。私の答えを変えてバグを書き留め、バッチ処理をせずに単純化したクエリを提案しました。 – InverseFalcon

関連する問題