2016-11-18 65 views
0

我有單獨的暗號查詢如下:組合兩個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:

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

從Q2 :

a | 1 
b | 1 
c | 4 
e | 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)作爲from1'並使用'RETURN m,from1,...'而不是第二個'WITH'。 –

+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) 

雖然我不能完全肯定這是否會返回你所期望的數量,因爲你通過查找n開始,但隨後進行m而不是向前,使(m)-[d]->(n)路徑將匹配從根本上不同的圖案。儘管如此,你仍然走在正確的軌道上;只需在收集所有結果行之前繼續添加內容,然後展開一個大集合並執行聚合或其他分析。

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); 

(並假設查詢使用正確的IDm),該查詢返回::

您可以先創建示例數據測試

+---------------+ 
| name | counts | 
+---------------+ 
| "a" | [2,1] | 
| "b" | [1,1] | 
| "c" | [4,4] | 
| "d" | [3,0] | 
| "e" | [0,2] | 
+---------------+