2013-04-08 80 views
3

我有以下圖形設置:的Cypher查詢返回重複的結果

start root=node(0) 
create (F {name:'FRAME'}), (I {name: 'INTERACTION'}), (A {name: 'A'}), (B {name: 'B'}), 
root-[:ROOT]->F, F-[:FRAME_INTERACTION]->I, I-[:INTERACTION_ACTOR]->A, I-[:INTERACTION_ACTOR]->B 

而下面的查詢將返回複製的結果:

START actor=node:node_auto_index(name='A') 
MATCH actor<-[:INTERACTION_ACTOR]-interaction-[:INTERACTION_ACTOR]->actor2, 
    frame-[:FRAME_INTERACTION]->interaction 
RETURN frame, interaction 

Query Results 

+-----------------------------------------------------+ 
| frame     | interaction     | 
+-----------------------------------------------------+ 
| Node[1]{name:"FRAME"} | Node[2]{name:"INTERACTION"} | 
| Node[1]{name:"FRAME"} | Node[2]{name:"INTERACTION"} | 
+-----------------------------------------------------+ 
2 rows 
52 ms 

即使我再添加一個開始節點試圖限制結果,我有相同的:

START actor=node:node_auto_index(name='A'), frame=node:node_auto_index(name='FRAME') 
MATCH actor<-[:INTERACTION_ACTOR]-interaction-[:INTERACTION_ACTOR]->actor2, 
    frame-[:FRAME_INTERACTION]->interaction 
RETURN frame, interaction 

我想了解爲什麼查詢返回重複編輯結果。 我知道可以通過使用distinct來返回唯一的結果,但是是否可以通過匹配路徑來更改查詢以僅返回一個結果,而無需應用額外的操作(distinct)?

(設置和查詢可以在http://console.neo4j.org/?id=q2e0ay測試)

回答

3

如果添加actor2來回報您列表中,您將看到的問題是什麼:

frame     interaction     actor    actor2 
(7 {name:"FRAME"}) (8 {name:"INTERACTION"}) (9 {name:"A"}) (9 {name:"A"}) 
(7 {name:"FRAME"}) (8 {name:"INTERACTION"}) (9 {name:"A"}) (10 {name:"B"}) 

演員「A」被列爲actor2的值!但是當你考慮這個問題時,這是有道理的,因爲在你的查詢中沒有任何地方告訴neo4j actoractor2需要是不同的實體。

幸運的是這很容易做到:

START actor=node:node_auto_index(name='A') 
MATCH actor<-[:INTERACTION_ACTOR]-interaction-[:INTERACTION_ACTOR]->actor2, 
    frame-[:FRAME_INTERACTION]->interaction 
WHERE actor <> actor2  //like this! 
RETURN frame, interaction 
+0

謝謝!我被集中在一個更復雜的查詢中,在這個簡單的例子中,我沒有看到眼前的解決方案。 – 2013-04-09 11:03:44