2016-08-04 12 views
0

私は、cypherステートメントでリンクリストを作成するのに苦労しています。私は各kに対して以下のことをしようとしています。リンクされたリストと:NEXT関係はkによって分離されるべきです。ノードで接続されたすべてのノードのリンクリストを作成します。

match (elem:Event)<-[r:HAS_EVENT]-(k) 
WITH elem ORDER BY elem.id ASC 
WITH COLLECT(elem) AS elems 
FOREACH (n IN RANGE(0, LENGTH(elems)-2) | 
FOREACH (prec IN [elems[n]] | 
FOREACH (next IN [elems[n+1]] | 
MERGE (prec)-[:NEXT]->(next)))) 

Iが一致しようとしたforeachステートメントの内部MATCHステートメントを実行するit'sができないので、K及び各kのことで、このコードを実行するための他の可能な方法としてX X UNWINDとして有する(Some_Label)を(IDロックアップなど)。私はいつも長い鎖で終わります:NEXT throu all:イベントノード。これは、matchステートメントがすべてのk個のノードを考慮することを示唆しています。私はどのように一致するかについての助けが必要です:Some_Labelノードとそれらのそれぞれを上記のコードに渡します。

+0

あなたのデータはどのように見え、誰が 'k'ですか?あなたの問題をよりシンプルに/より詳細に記述できますか? –

+0

kはこの場合のサポートチケットです。だから私は各チケットのリンクリストを作成したい。それぞれ:イベントノードには、それに接続されたいくつかの他のノード、ステータス、カテゴリ化などがあります。各:チケットノードにはいくつかのイベントノードが接続されています。 :チケットと:イベントラベルはIDでインデックス付けされています 問題は、グラフにあるチケット(MATCH(k:Ticket))を前の一致ステートメントの各kに対して実行することです。 –

+0

MATCH(a:Ticket): ---ちょっとした例--- match(elem:Event)< - [r:]:このエントリは、ロードされたCSVステートメントから理想的にはロードされますが、 HAS_EVENT] - (k) WITH elem ORDER BY elem。id ASC WITH COLLECT(elem)AS elems FOREACH(n IN RANGE(0、LENGTH(elems)-2)| FOREACH(prec IN [elems [n]] | FOREACH(次のIN [elems [n + 1] ])| マージ(prec) - [:NEXT] - >(next)))) –

答えて

0

このような音が2つあります。まず、リンクされたリスト(フィルタリング、並べ替えなど)に含めるkノードだけを照合します。

これを取得したら、それらをリストに集めてapoc.coll.pairs([list]) YIELD valueを使用するだけです。これは、リストを各シーケンシャルエレメントのペアのリスト([[first、second]、[second、third] ...])に変更します。最後のペアは[last、null]です。

その時点で、各要素(ペア)に対してFOREACHを実行し、あなたの:NEXT関係をマージするだけです。あなたが興味を持っているk個の要素を反復する周期関数を使用しているよう

EDIT

が見える。あなたは、ネストされたforeach文を置き換えるためにCOLLECT()とのペア()関数を使用することができます。

+0

FOREACH内のpairs()プロシージャで生成されたペアの使用に問題があるようです。 [このバグ](https://github.com/neo4j-contrib/neo4j-apoc-procedures/issues/94)が問題を取り上げています。 – InverseFalcon

0

NEXTチェーンをEventsのリスト内に作成するとします。各Eventリストは、MATCHから特定のkノードになります。

私はあなたが注文ステップに続いてわずかに異なるWITH句でこれを達成することができるかもしれないと思う:

MATCH (k:Ticket) // however you match here... 
WITH k 
// MATCH your k to Events 
MATCH (elem:Event)<-[r:HAS_EVENT]-(k) 
// include k in the WITH clause 
// now you have one result 'row' per k with the matching elem nodes 
WITH k, COLLECT(elem) AS elems 
// UNWIND, ORDER BY and collect() again to sort the list in each row 
UNWIND elems AS x 
WITH x ORDER BY x.id ASC 
WITH collect(x) AS ordered_elems_per_k 
// now the foreach should be applied for each k/list of elem pair 
FOREACH (n IN RANGE(0, LENGTH(ordered_elems_per_k)-2) | 
FOREACH (prec IN [ordered_elems_per_k[n]] | 
FOREACH (next IN [ordered_elems_per_k[n+1]] | 
MERGE (prec)-[:NEXT]->(next)))) 

私はそれがORDER BYcollect()を組み合わせることが可能ではないと思います。これはあなたの問題を簡単な方法で解決しますが、この行に沿った何かがうまくいくはずです。

0

私はこれを解決することができました。

CALL apoc.periodic.iterate('Match (a:Ticket) return id(a) as id_p', 
'match (elem:Event)<-[r:HAS_EVENT]-(k) where id(k)={id_p} 
WITH elem ORDER BY elem.id ASC WITH COLLECT(elem) AS elems 
FOREACH (n IN RANGE(0, LENGTH(elems)-2) | 
FOREACH (prec IN [elems[n]] | 
FOREACH (next IN [elems[n+1]] | MERGE (prec)-[:NEXT]->(next))))', 
{batchSize:1000,parallel:true}) YIELD batches, total 
関連する問題