2014-01-10 47 views
0

我有一個返回封閉的圈子結果像Neo4j的參觀圈內節點只有一次

a-b-t-y-a 
b-t-y-w-b 

等一個暗號查詢...

不時我得到這樣

a-b-c-b-e-f-a 
c-e-r-e-f-g-c 
c-e-r-c-d-a-c 
結果

我不需要

在這兩個結果中,我有b-在第一和e在第二次訪問twi ce和c是 不僅顯示在開始和結束,因爲它應該是,但也在中間。 。

如何避免在結果的內部獲得相同節點或者在內部獲取開始和結束節點時獲得結果。在結果的開始和結尾處的相同節點都很好。

我現在的暗號查詢:

start n=node(*) match p=n-[r:OWES*1..200]->n 
where HAS(n.taxnumber) 
return extract(s in `relationships(p) : s.amount), extract(t in nodes(p) : ID(t)), length(p); 

我越來越有taxnumber財產與關係欠連接的所有 高達200級的所有節點。

回答

2

如果您不能使用CASE你可以試試這個。我在1.8.3服務器上測試過它,它運行正常。我無法得到它與減少工作。我收到了幾個不同的意外錯誤,包括'未關閉的括號'和類型比較問題,這是我開始工作的唯一查詢。我還在2.0服務器上運行了它,它在約39秒內完成了邁克爾對案例和縮減的查詢,在模擬數據集上約23秒內完成。

START n=node(*) 
MATCH p=n-[r:OWES*1..200]->n 
WHERE HAS(n.taxnumber) AND 
    ALL(x IN tail(nodes(p)) WHERE SINGLE(y IN tail(nodes(p)) WHERE x=y))   
RETURN EXTRACT(s IN relationships(p) : s.amount), EXTRACT(t IN nodes(p) : ID(t)), length(p) 
+0

這工作正常! –

1

難道你不能檢查路徑中的不重複嗎? 現在密碼錯過了一個簡單的uniq函數,這裏是一個解決方法。

這是Neo4j的2.0,1.9不具備的情況下時,有可能是更多地參與,可能使用過濾器

start n=node(*) 
match p=n-[r:OWES*1..200]->n 
where HAS(n.taxnumber) AND 
    reduce(a=tail(nodes(p)), x in tail(nodes(p)) | 
     case when a IS NOT null OR x in tail(a) then null else tail(a) end) IS NOT NULL 
return extract(s in relationships(p) | s.amount), extract(t in nodes(p) | ID(t)), length(p); 

1.9你可以用一個表達這樣的查找重複:

WITH [1,2,3] AS科爾

reduce(a=false, x IN coll : a OR length(filter(y IN coll : x = y))> 1) 

它的工作原理是這樣的:

  • 使用尾部(節點(路徑))b/c你有相同的開始和結束節點,它始終是重複的
  • 它減少了集合的所有元素,並且當它沒有再次找到元素集合的其餘部分就返回集合的休息和重複
  • 否則返回null和快捷方式
+0

我得到未關閉的括號例外,當我運行的Cypher代碼...案例時 –

+0

我認爲這可能是由於混合新舊迭代語法,':'和'|'。我編輯使用'|'在整個,現在它的工作?(如果你使用舊版本的neo版本替換':') – jjaderberg

+0

我的編輯被拒絕了,但試着改變查詢爲:'path'到'p',一致的迭代語法(在你的版本中可能是':','''當前)和'不爲空的情況'應該是'空時的情況'。 – jjaderberg