2015-04-23 62 views
1

我有我運行此查詢一個簡單的測試圖:Neo4j的暗號查詢與失敗「不知道怎麼來比較」

MATCH p = (l)-[*1..1]->(start)-[*3..3]->(r) where id(start) = 1101 return l,r 

這用於Neo4j的2.1工作,但升級後2.2,它不再做,給這個錯誤:

Don't know how to compare that. Left: [:has_participant[1027]{}] ($colon$colon); Right: :sampled[1025]{} (RelationshipProxy) 

此查詢的工作:

MATCH p = (l)-[*1..1]->(start)-[*1..1]->(r) where id(start) = 1101 return l,start,r 

在這個可視化得到的:

的左節點爲(L),約翰節點(開始)和綠色節點(R)。

如果我雙擊綠色的節點上,並出現在節點上,然後雙擊,我可以讓我的意圖(R)的節點,其中被標記爲車道:

樹中的每個「級別」都加入了不同的關係; 'has_participants'連接(l)到(開始),'採樣'連接(開始)到綠色節點。 「準備」將綠色連接至藍色,並且「排序」將藍色連接至粉紅色。

給定(開始),我如何到達(l)和上面顯示的2個粉紅色Lane節點而不會遇到錯誤?我實際上試圖做的是一個通用的「給我(起始)的後代節點至少3步走」,所以我不能使用採樣 - >準備 - >順序關係路徑的知識。

這裏我們解釋的問題,查詢的結果:

enter image description here

這種變體的查詢工作:

MATCH p = (l)-->(start)-[*3..3]->(r) where id(start) = 1101 return l,r 

但爲什麼我的原始查詢停止工作?如果我想在左邊做2..2怎麼辦?

編輯:其實,更奇怪的是,這些工作:

MATCH p = (l)-[*0..1]->(start)-[*3..3]->(r) where id(start) = 1101 return l,r 
MATCH p = (l)-[*1..2]->(start)-[*3..3]->(r) where id(start) = 1101 return l,r 

只有1..1左側失敗。

回答

0

你真的不應該使用id()函數進行查詢 - 它們可以改變。

如果你

MATCH P =(L)會發生什麼 - [* 1..1] - >(啓動{名字: 「約翰」}) - [* 3..3] - >( r)return l,r

您可能想要在「開始」節點的標籤/屬性上放置索引。

+0

我先跑過的一個先前的查詢通過索引屬性找到John。現在我有一個約翰節點,並試圖找出有關它的事情,比如它的父母是什麼,以及它的後代有三步之遙。無論如何,你的版本會導致相同的錯誤。 – sbs

+0

「有問題」[:has_relationship]和[:取樣]關係在哪裏?在[* 1..1]或[* 3..3]中?您是否在查詢之前嘗試過使用EXPLAIN?你是否試過用[* 1..1]代替 - ? –

+0

正如問題中提到的,has_relationship在1..1的左邊,採樣在右邊,是..3的第一步。我會將解釋的結果添加到問題中。用1..1代替 - 它可以工作。 – sbs