簡體   English   中英

Cypher中的路徑屬性

[英]Path properties in Cypher

我在Neo4j中有以下圖表

(id:5,t:e)<--(id:4,t:w)<--(id:0;t:s)-->(id:1,t:w)-->(id:2,t:b)-->(id:3,t:e)

現在,我搜索從具有t:s的節點到具有t:e節點的路徑,這樣只有中間列出了具有t:w白名單節點。

因此,理想情況下,我需要一個查詢來僅返回(0)->(4)->(5),而不返回(0)->(1)->(2)->(3)。

編輯:我忘了提到路徑可能具有可變的長度:從0到潛在的無限。 這意味着我可能有任意數量的“ t:w”節點

最好的祝福

僅使用上面提供的信息即可使用

MATCH p=({t:'s'})-->({t:'w'})-->({t:'e'}) RETURN p

當然,如果s可以直接鏈接到e ,則需要使用可變長度關系匹配。

MATCH p=({t:'s'})-[*0..1]->({t:'w'})-[]->({t:'e'})
RETURN DISTINCT p

編輯-任意長度的路徑

MATCH p=({t:'s'})-[*0..1]->({t:'w'})-[*]->({t:'e'})
RETURN DISTINCT p

要匹配任意長度的路徑,請在關系路徑匹配中使用*運算符。 通常最好在該匹配上設置一些界限,例如*0..1 (長度為0到1)。 您可以將任一端打開*..6 (長度1到6)或*2.. (長度2到任意長度)。

問題在於,現在您不能保證中間節點中的節點類型(因此t:"b"將被匹配)。 為了避免這種情況,我認為您必須進行過濾。

MATCH p=({t:'s'})-[*]->({t:'e'})
WHERE ALL (node IN NODES(p)
   WHERE node.t = 's' OR node.t = 'w' OR node.t = 'e' )
RETURN p

結束編輯

您應該在節點上引入標簽,並使用關系類型進行遍歷,因為這是Neo / Cypher能夠為您提供幫助的地方。 您還應確保,如果匹配的屬性正確索引了它們。

暫無
暫無

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

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