[英]Neo4j: Query for a path between two nodes in a specific order of relationships and knowing only label of the last node
例如,如果我有一個具有以下標簽和關系的復雜圖形:
N1-a-> N2-b-> N3-c-> N4
N2-d-N5-e-> N3
等等
現在,我想使用Cypher查找從(:N1 {id:'xyz'})到N4類型的任何節點的路徑,但我希望關系的順序相同,即a,b,c。
另外,如果沒有N3類型的節點連接到N4類型的節點,我想返回路徑直到N3
我想知道是否有辦法做到這一點。 有人可以幫忙嗎? 我是Neo4j的新手
如果您明確知道要遍歷的關系,那么您應該可以使用Cypher進行此操作,盡管如果沒有N4,則返回N3的條件可能很棘手。
N3的標簽是否已知,還是您只想盡可能地走這條路? 另外,如果沿着路徑而不是僅在路徑末尾遇到標簽N4的節點,您是否也想要這些節點,還是只對關系鏈末端的N4感興趣?
另外,您是否對找到的所有可能路徑感興趣,或者僅需要一條路徑(如果存在)?
如果您明確知道(並可以在查詢中定義)要遍歷的關系,並且如果只需要一個路徑(如果存在),並且只對結尾處的標簽N4感興趣,則此查詢應該可以工作(或之前的節點(如果末尾沒有N4):
MATCH p=(:N1{id:'xyz'})-[:a]->()-[:b]->()-[:c*0..1]->(last)
WHERE length(p) = 3 and last:N4 OR length(p) = 2
WITH p
ORDER BY length(p) DESC
LIMIT 1
RETURN p
如果條件更復雜,則可能需要APOC路徑擴展程序。
對於使用APOC路徑擴展器,如果您使用的是2018年冬季或更早版本的APOC版本,則可以利用新的序列功能,該功能可讓您定義節點標簽和關系類型的重復序列。 在這種情況下,我們將使用maxLevel
config參數限制重復。
MATCH (start:N1{id:'xyz'})
CALL apoc.path.expandConfig(start, {sequence:'N1, a>, N2, b>, N3, c>, N4', maxLevel:3}) YIELD path
RETURN path
ORDER BY length(path) DESC
LIMIT 1
如果您不關心(或不知道)路徑中的標簽(最后一個標簽N4除外),則可以將*
用作標簽,如下所示:
sequence:'*, a>, *, b>, *, c>, N4'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.