2016-11-18 13 views
0

で2つのサイファー文の出力を結合:次のように私は別CYPHERクエリを有する凝集

次のサンプルの結果を返す
Q1: START m=node(30) MATCH (m)-[d:define]->(n) where d.start=4 RETURN n.name,COUNT(d) as count 
Q2: START m=node(30) MATCH (m)-[d:define]->(n) where d.start=5 RETURN n.name,COUNT(d) as count 

:Q1から

:Q2から

a | 2 
b | 1 
c | 4 
d | 3 

を:

a | 1 
b | 1 
c | 4 
e | 2 

私は結果をオフラインで処理し、結合カウントを生成できますが、上記の2つのサイファークエリを組み合わせて、d.start 4と5から次のマージカウントを得ることはできますか?

a | 2 | 1 
b | 1 | 1 
c | 4 | 4 
d | 3 | 0 
e | 0 | 2 

私がこれまで持っていたこと:名前とカウント(d)を次の段階に進めるにはどうすればよいですか?

START m=node(30) 
MATCH (m)-[d:define]->(n) 
where d.start=4 
WITH m, COLLECT (n.name, COUNT(d)) as from1 
MATCH (m)-[d:define]->(n) 
where d.start=5 
WITH m, COLLECT (n.name, COUNT(d)) as from2 

ユニオンは、私が結果を一緒に結合したくないので、私にとっては機能しません。私はd.start = 4と5からのカウントを分離する必要があります。その結果、交差点のようになります。

+0

あなたの質問をいくつかのタイプミスがあるようです。例えば、Q1とQ2は 'A'を定義しますが、決して使用しません。最終的なクエリはどこにも定義されていない 'c'を数えます。これらの問題を少なくとも修正して、結果を示すサンプルデータを提供できますか? (また、最近のバージョンのCypherでは、あなたが使っている方法でもはや 'START'を使うことはできませんが、それは比較的簡単に修正できます)。 – cybersam

+0

あなたは解決策がそれほど遠くないわけではありません。あなたはcollectを使う必要はありません。最初の 'WITH'節で' COUNT(d1)as from1'を使い、2回目の 'WITH'の代わりに' RETURN m、from1、... 'を使います。 –

+0

@cybersamオススメして、ごめんなさい。私はCypherの古いバージョンを使用しています。 – kami

答えて

1
MATCH (n) 
WHERE ID(n) = 30 
MATCH (m)-[d:define]->(n) 
where d.start=4 
WITH m, COLLECT([n.name, COUNT(c)]) as from1 
MATCH (m)-[d:define]->(n) 
where d.start=5 
WITH m, from1 + COLLECT([n.name, COUNT(c)]) as from2 
UNWIND from2 AS row 
WITH row[0] AS name, row[1] AS ct 
RETURN name, SUM(ct) 

私は(m)-[d]->(n)パスは根本的に異なるパターンに一致するように、これは、あなたがnを見つけることによって開始するので、あなたが期待カウントを返しますが、その後、代わりに前方mを運ぶ場合は、完全にはわからないけど。あなたは正しい軌道に乗っています。すべての結果行が得られるまでコレクションに物を追加してから、大きなコレクションを巻き戻して、集計やその他の分析を実行してください。

0

私はあなたがCOLLECTを捨てて、COUNTしか使用できないと信じています。

例データセット:

CREATE 
    (m {name: 1}), 
    (m)-[:define {start: 4}]->({name: 2}), 
    (m)-[:define {start: 4}]->({name: 3}), 
    (m)-[:define {start: 5}]->({name: 4}) 

問合せ:

MATCH (m)-[d:define]->() 
WHERE d.start=4 
WITH m, COUNT(d) as from1 
MATCH (m)-[d:define]->() 
WHERE d.start=5 
RETURN m.name, from1, COUNT(d) as from2 

結果:

╒══════╤═════╤═════╕ 
│m.name│from1│from2│ 
╞══════╪═════╪═════╡ 
│1  │2 │1 │ 
└──────┴─────┴─────┘ 
1

このクエリでは、あなたが欲しいものを行う必要があります。

MATCH (m)-[d:define]->(n) 
WHERE ID(m) = 30 AND d.start IN [4, 5] 
RETURN n.name AS name, REDUCE(c = [0, 0], x IN COLLECT(d.start) | 
    CASE WHEN x = 4 THEN [c[0]+1, c[1]] ELSE [c[0], c[1]+1] END) AS counts 
ORDER BY name; 
をが

あなたが最初にあなたのサンプルデータを作成することによって、それをテストすることができます:上記のデータと

CREATE (m:Foo), (a:Foo {name: 'a'}), (b:Foo {name: 'b'}), (c:Foo {name: 'c'}), (d:Foo {name: 'd'}), (e:Foo {name: 'e'}), 
    (m)-[:define {start:4}]->(a), 
    (m)-[:define {start:4}]->(a), 
    (m)-[:define {start:4}]->(b), 
    (m)-[:define {start:4}]->(c), 
    (m)-[:define {start:4}]->(c), 
    (m)-[:define {start:4}]->(c), 
    (m)-[:define {start:4}]->(c), 
    (m)-[:define {start:4}]->(d), 
    (m)-[:define {start:4}]->(d), 
    (m)-[:define {start:4}]->(d), 
    (m)-[:define {start:5}]->(a), 
    (m)-[:define {start:5}]->(b), 
    (m)-[:define {start:5}]->(c), 
    (m)-[:define {start:5}]->(c), 
    (m)-[:define {start:5}]->(c), 
    (m)-[:define {start:5}]->(c), 
    (m)-[:define {start:5}]->(e), 
    (m)-[:define {start:5}]->(e); 

を(とクエリがmの正しいIDを使用していることを仮定して)、クエリは返します

+---------------+ 
| name | counts | 
+---------------+ 
| "a" | [2,1] | 
| "b" | [1,1] | 
| "c" | [4,4] | 
| "d" | [3,0] | 
| "e" | [0,2] | 
+---------------+ 
関連する問題