2014-04-24 53 views
3

我想對我的路徑匹配模式施加限制。 我想基於上一次使用關係的類型匹配下一個關係。基於以前的關係的Cypher匹配路徑

下面是一個簡化的數據庫的一個例子:

(A)-1-(B)-2-(C)-1-(E)-2-(F) 
     |   | 
     3----(D)----3 

查詢1:

start n=node(A), m=node(F) 
match p=n-[r*]-m 
return p 

應導致兩個路徑

(A)-1-(B)-2-(C)-1-(E)-2-(F) 
(A)-1-(B)-3-(D)-3-(E)-2-(F) 

然而,運行查詢從節點開始時(F):

start m=node(F),n=node(A) 
match p=m-[r*]-n 
return p 

結果應該是唯一的:

(F)-2-(E)-1-(C)-2-(B)-1-(A) 

路徑

(F)-2-(E)-3-(D)-3-(B)-1-(A) 

應該是無效的,因爲它違反了這些約束:

  1. 從-1-類型的關係即將您可以繼續使用012-或關係。
  2. 來自-2或-3型關係,您只能進行 -1-關係。

這些路徑是有效的:

()-1-()-2-() 
()-1-()-3-() 
()-2-()-1-() 
()-3-()-1-() 

這些路徑是無效的:

()-3-()-2-() 
()-2-()-3-() 

回答

1

首先,給予好評的非常詳細,具體,清楚地闡明問題。

不幸的是,我不認爲你可以用Cypher來做你想做的事情,我想你需要Traversal API來做到這一點。 Cypher是一種聲明性語言;也就是說,你告訴它你想要什麼,它就會爲你獲得。使用遍歷API是查詢的必要方法;也就是說,你告訴neo4j如何遍歷圖。

您的查詢在這裏強制約束關係得到遍歷的順序,以及什麼使得有效的路徑。沒有什麼不對,但我相信對遍歷順序施加限制隱含意味着你告訴密碼以哪種方式來遍歷,並且你不能用密碼來實現,因爲它是聲明性的。聲明式與命令式事物的另一個常見例子是寬度優先與深度優先搜索。如果你正在尋找特定的節點,你不能告訴密碼人先縱深先行;你只需告訴它你想要哪個節點,然後就可以得到它們。

現在,路徑可以像collections in cypher via the relationships() function.一樣處理。您可以使用filterreduce函數處理單個關係。但是你的查詢比較困難,因爲你需要一些代碼,比如說「如果路徑中的第一個關係是1,那麼下一個必須是2或者3」。這正是您可以在Traversal API中使用Evaluators所做的事情。檢查界面,你可以看到你如何編寫自己的方法,通過Evaluator#evaluate(Path path)完全實現你正在討論的邏輯。因爲聲明式查詢(cypher)隱藏了你的遍歷細節,恕我直言,如果你可以聲明你想要的東西,那麼最好使用聲明式查詢來簡化它。但有些情況下,您必須控制遍歷的順序,並且需要遍歷。 (我曾經遇到過需要通過廣度優先搜索將所有節點連接到其他節點的情況,沿着複雜的關係標準,最大深度爲3,我無法使用密碼)。

爲了給你一個前進的方向,請檢查我在遍歷框架中提供的鏈接。也許你可以把你的查詢描述爲TraversalDescription,然後把它交給neo4j來運行。

相關問題