有沒有辦法在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})
我需要每一個節點x
, x.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
作爲0
即b.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
。
我用路徑寫了一個查詢。但是,它沒有按預期工作。可能還有其他一些邏輯錯誤。 這是它的。 MATCH(x) - [] - >(u) WHERE x.id in ['m','n' ,'o'] FOREACH(n in nodes(p)| set n.marked = x.marked + n.marked)' –
順便說一句,你的查詢並不是我所期望的。我編輯了我的問題並添加了一些細節。我希望我現在會清楚。我還添加了我的解決方案與有問題的路徑。我希望它能幫助你理解我的問題。 –