2016-10-29 20 views
0

AccountTransferの2つのノードタイプがあります。 Transferは、Accountノード間の資金移動を示します。 Transferノードには、任意の数の入力ノードと出力ノードがあります。たとえば、3つのAccountsは、それぞれが$ 40($ 120を組み合わせたもの)を16個に送信することができます。Accountsは、どのような方法であっても動作します。Neo4j/Cypher:ノード内のノード間の関係の値の合計を返す

オブジェクトは、つまり、送受信された資金の合計がありません。つまり、関係自体にのみ格納されます。私はcypherクエリでこれを計算し、返されたTransferオブジェクトの一部として返したいと思います。は別途ではありません。 (SQL JOINに似ています)

私はNeo4j + Cypherの方がかなり新しいです。これまでのところ、私が持っているクエリはこれです:私はこのデータベースを管理している場合

MATCH (tf:Transfer {id:'some_id'}) 
MATCH (tf)<-[in:IN_TO]-(in_account:Account) 
MATCH (tf)-[out:OUT_TO]->(out_account:Account) 
RETURN tf,in_account,in,out_account,out, sum(in.value) as sum_in, sum(out.value) as sum_out 

、私はちょうど金額を事前計算し、Transferプロパティに格納したい - それは、この時点でオプションではありません。

TL; DR:私は返さtfオブジェクトにsum_insum_outを保存したいと思います。

答えて

0

SUMのような集約を使用する場合は、集計されたエイリアスを結果行から除外するか、1行合計で終了する必要があります。それは、既存のマップへの動的特性を割り当てるための唯一の方法だから、

CREATE (temp) 
WITH temp 
MATCH (tf:Transfer {id:'some_id'}) 
MATCH (tf)<-[in:IN_TO]-(in_account:Account) 
MATCH (tf)-[out:OUT_TO]->(out_account:Account) 
SET temp += PROPERTIES(tf) 
WITH temp, SUM(in.value) AS sum_in, SUM(out.value) AS sum_out, COLLECT(in_account) AS in_accounts, COLLECT(out_account) AS out_accounts 
SET temp.sum_in = sum_in 
SET temp.sum_out = sum_out 
WITH temp, PROPERTIES(temp) AS props, in_accounts, out_accounts 
DELETE temp 
RETURN props, in_accounts, out_accounts 

あなたがプロパティを保持するためにダミーノードを作成している:これは、あなたの動的プロパティの割り当てのための回避策を含め、あなたが望むものに近い何かを得るのを助ける必要がありますまたはMap-alikesを使用しますが、ノードはグラフにコミットされません。このクエリは、追加の作業を行う必要がある場合に備えて、内/外の合計を含む:Transferのプロパティのマップと、インアカウントとアウトアカウントのリストを返します。

+0

タイポキャッチのためのガーボルへのh/t。 –

0

Tore Eschlimanの答えは、特に集約エイリアスのプロパティについて非常に洞察力があります。

私は、この場合にはうまくいくかもしれない、よりハックな解決策を考え出しました。

例データセット:

CREATE 
    (a1:Account), 
    (a2:Account), 
    (a3:Account), 
    (tf:Transfer), 
    (a1)-[:IN_TO {value: 110}]->(tf), 
    (a2)-[:IN_TO {value: 230}]->(tf), 
    (tf)-[:OUT_TO {value: 450}]->(a3) 

クエリ:

MATCH (in_account:Account)-[in:IN_TO]->(tf:Transfer) 
WITH tf, SUM(in.value) AS sum_in 
SET tf.sum_in = sum_in 
RETURN tf 
UNION 
MATCH (tf:Transfer)-[out:OUT_TO]->(out_account:Account) 
WITH tf, SUM(out.value) AS sum_out 
SET tf.sum_out = sum_out 
RETURN tf 

結果:

╒═══════════════════════════╕ 
│tf       │ 
╞═══════════════════════════╡ 
│{sum_in: 340, sum_out: 450}│ 
└───────────────────────────┘ 

UNIONが多重集合を実行UNION ALLとは対照的に、和集合を(行うこと/ bag union)、結果に重複はありません。

更新: Tore Eschlimanがコメントに指摘しているように、このソリューションはデータベースを修正します。回避策として、後で結果を収集してトランザクションを中止することができます。

+0

これは ':Transfer'ノードを永久に変更します。 –

+0

良い点。私はそれを修正しようとしましたが、これは問題を解決するための良い方向ではないようです。私は今、ソリューションに興味がありますが、サンプルデータセットでクエリを処理することはできませんでした。「DELETE temp」を使用すると、結果の行には空の値と空の値のコレクションがいっぱいになります。 'DELETE temp'を削除すると、それは魅力のように機能します。 (私はNeo4j 3.0.4を使用しています) –

+0

あなたは絶対に間違いない、私は最も重要な部分を忘れてしまった。削除する前に別のエイリアスに 'PROPERTIES(n) 'を割り当てる必要があります。そうしないと消えます。 –

関連する問題