2015-10-22 39 views
1

有沒有辦法在Cypher中編寫遞歸查詢? 我必須遍歷從一組節點(標籤爲L)到另一組節點(m, n, o, ...)的所有路徑。圖形是定向和有像使用Cypher在Neo4j圖形上進行遞歸查詢DB

> (m, n, o, p, ...) -[*]-> ({:L}) 

多個路徑的遞歸查詢具有概述此僞代碼

ForEach x where x HasLabel l: 
    rec(x) 
Def rec(node x): 
    If x in (m, n, o, p): 
     return 
    ForEach y where y-->x: 
     rec(y) 
     x.prop = f(y.prop, x.prop) 
     //f(a,b) is a trivial arithmetic function with subtraction and division. 

解決這不需要是遞歸的。任何其他解決方案將不勝感激。


編輯:查詢開始 之前,按要求m.prop, n.prop, ..被設置爲某些值。圖中的所有其他節點(如x)都有它們的x.prop = 0

存在多個定向路徑(m,n,o,..)-[*]->({L})。 對於這些路徑,其中(m,n,o,..)-[*]->y-->x-[*]->({:L})我需要每一個節點xx.prop = x.prop + y.prop.

這是一個屬性傳播從(m,n,o)({:L})的方式。


實施例:

a-->b-->c-->d:L 
    ^
    | 
e-->f-->g:L 

在開始時,a.prop = 1, e.prop = 2和所有其他節點具有prop作爲0b.prop = f.prop = c.prop = d.prop = g.prop = 0

Step 1: f.prop = 2 
Step 2: b.prop = 1+2 = 3 
Step 3: c.prop = 3, g.prop = 2 
Step 4: d.prop = 3 

在每個節點處x如遞歸地定義時,該例程是容易 x.prop += (y.prop + z.prop + ...)其中y-->x, z-->x, ...

我希望這會消除混亂。


編輯: 我張貼計算器以前寫使用路徑的查詢。但是,foreach循環可能存在邏輯錯誤或問題。這可能有助於提出解決方案。

MATCH p=((u)-[*]->(v:L{})) 
MATCH (x)-[]->(u) 
WHERE x.id in ['m','n','o'] 
FOREACH(n in nodes(p) | set n.marked=x.marked+n.marked) 

編輯:抓到我的查詢問題。上面的查詢爲最後標記爲'L'的節點正確設置屬性。但是,沒有如果我的查詢與a.marked=1開始,完成這臺b.marked=2後正確設置該屬性的路徑節點的場景是這樣

c-->d:L 
    ^ 
    | 
a-->b-->e:L 

。因爲b處於兩條通向標籤爲'L'的節點的路徑。但是,b.marked=1是預期值,因爲它僅通過一個路徑連接到節點a

回答

0

我不是100%確定我做對了。描述你想用英語做什麼可能會有所幫助。不過,這裏有一個刺在它:

MATCH path=(start)-[*0..5]-(:L) 
WHERE start.prop > 0 
WITH nodes(path)[-2] AS x, y 
SET y.prop = (y.prop + x.prop) 

因爲我們正在做的一個變量路徑匹配,path會發現在入站的方式連接到它的每一個節點從l每一條路徑。我們不包含任何排除列表中的y值。然後對於每個path發現我們採取倒數第二(x)和最後(y),並做我們的計算和我們的SET

希望有幫助!

編輯:從你的例子看來,你想要匹配的關係無論方向(似乎你只是想匹配路徑傳入的起點)。我刪除了小於(<),以便路徑雙向匹配。我現在也做了一些其他更改,以便更好地理解問題,我認爲這可能會有所幫助。

另外請記住,我在變量路徑的大小上添加了限制。您可能希望根據圖形的大小/拓撲結構將其調整爲更大(或根本不受限制)。還請注意-[*]-匹配(我認爲)從長度爲1的路徑到無限長度的路徑。所以,如果您調整我的解決方案,您可能會想要使用-[0..],因爲零路徑長度的選項對它非常重要。

+0

我用路徑寫了一個查詢。但是,它沒有按預期工作。可能還有其他一些邏輯錯誤。 這是它的。 MATCH(x) - [] - >(u) WHERE x.id in ['m','n' ,'o'] FOREACH(n in nodes(p)| set n.marked = x.marked + n.marked)' –

+0

順便說一句,你的查詢並不是我所期望的。我編輯了我的問題並添加了一些細節。我希望我現在會清楚。我還添加了我的解決方案與有問題的路徑。我希望它能幫助你理解我的問題。 –