簡體   English   中英

使用Cypher從Neo4j Graph數據庫中的一系列節點獲取完整路徑

[英]Get complete path from a sequence of nodes from Neo4j Graph database with Cypher

我正在存儲節點序列,其中一個節點與序列中的上一個節點以及代表“對象”的另一個節點相關。 因此,例如,我可能具有以下順序:

(S1)<-[r]-(S2)<-[r]-(S3)<-[r]-(S4)

然后,序列中的每個節點都與另一個節點相關,例如:

(S1)-[r]->(O1)
(S2)-[r]->(O2)
(S3)-[r]->(O1)
(S4)-[r]->(O3)

在此示例中,S1和S3都與O1相關。

我要實現的是將起始點指定為“ O1”,並能夠獲得上述示例中從S1到S4的完整路徑。

通過在S1中添加一個稱為“開始”的屬性,並在S4中添加一個稱為“結束”的屬性,我能夠實現這一點,以表示序列的開始和結束,並使用此查詢僅獲取完整的序列:

MATCH (O:Obj{name:'O1'}), 
path=(O)<-[:OBJECT]-(first:SEQ)<-[:PREV*]-(last:SEQ) 
WHERE has(first.start) 
AND has(last.end) 
return path

但是,我想知道如果沒有'start'和'end'屬性,是否有更好的方法來實現這一目標。 不使用屬性時遇到的問題是該序列已分解,因此我得到的不是一個序列:

(S1)<-[r]-(S2)
(S1)<-[r]-(S2)<-[r]-(S3)
(S1)<-[r]-(S2)<-[r]-(S3)<-[r]-(S4)
(S3)<-[r]-(S4)

是否有可能以任何方式僅獲得完整的序列?

您可以只要求last位於“鏈的末端”:

MATCH path=(:Obj {name:'O1'})<-[:OBJECT]-(:SEQ)<-[:PREV*]-(last:SEQ)
WHERE NOT (last)<-[:PREV]-(:SEQ)
RETURN path

是的你可以。 您只需要按大小將生成的路徑按降序排序,並僅返回最長的路徑。

match p=(:Obj {name:'O1'})<-[:REL]-(:SEQ)<-[:PREV*]-(:SEQ)
with p, size(nodes(p)) as seq_length
order by seq_length desc
limit 1
return tail(nodes(p))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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