簡體   English   中英

Neo4j:以特定的關系順序查詢兩個節點之間的路徑,並且僅知道最后一個節點的標簽

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM