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