![](/img/trans.png)
[英]How to check if a relation exists between two nodes using .net client of neo4j
[英]How to retrieve a list of unique paths between two nodes in my neo4j graph using cypher?
因此,我在neo4j中有一個有向圖,其中有兩個節點類型,即A和B。基本上,頂部A指向多個B,每個指向多個A,遞歸向下。 像這樣:
A1-> B1,B2,B3
B1-> A3,A4,A7
B2-> A5,A6,A8
A3-> B3
A4-> B3
A5-> B3
B3-> A9
無論如何,我要接受兩個不同的A,以查詢出這兩個A之間的所有唯一路徑。 因此,從上面給出的A1和A9,我需要以下內容作為輸出:
A1-> B1-> A3-> B3-> A9,
A1-> B1-> A4-> B3-> A9,
A1-> B2-> A5-> B3-> A9,
A1-> B3-> A9
如果可能的話,我也想從相同的查詢中刪除B(因為在這種情況下不需要使用B),所以最終結果如下:
A1-> A3-> A9,
A1-> A4-> A9,
A1-> A5-> A9,
A1-> A9
如果沒有,我可以在查詢后手動進行,盡管在查詢中會更好。 我將如何准確地構成該查詢?
到目前為止,我有這樣的事情:
var dic = new Dictionary<string, object> {{a1.toString(), a1}, {a2.toString(), a2}};
var query = _graphClient.Cypher
.Start(dic)
.Match(String.Format("p={0}-[*]->{1}", a1.toString(), a2.toString()))
//I don't know what goes here exactly... .Return(something)
.Results;
return query.Single();
我想我需要對多個密碼查詢執行某些操作才能刪除B。 也許像這樣使用它作為中介並將其應用於任何深度:
a1-[]->b-[]->a2
return a1, a2;
任何幫助都將是驚人的! 提前謝謝你!!!
更新
借助Christophe Willemsen的評論和這篇文章( Neo4j .NET Client-獲取從節點到其根的路徑 ),我能夠獲得以下c#代碼,除了從路徑中刪除B之外,該代碼可以執行所有操作:
var query = _graphClient.Cypher
.Match("p = (a2:A)-[*]->(a1:A)")
//Where and AndWhere's for matching a1 and a2 as necessary
.Return<IEnumerable<A>>("nodes(p)")
.OrderByDescending("length(p)")
.Results
.SelectMany(result => new List<List<A>> {result.ToList()});
return query.ToList();
如果有人知道如何指定nodes(p)僅返回A,則應該這樣做。 我可以簡單地遍歷每條刪除B的路徑,但是如果其中有很多,尤其是如果有一些巧妙的密碼方法來實現,那並不是很有效。 到目前為止,感謝您的幫助!
您可能可以將allShortestPaths算法與諸如此類的獨特算法一起使用:
MATCH (a:A { name:'A1' }),(aa:A { name:'A8' }), p = allShortestPaths((a)-[*]-(aa))
RETURN DISTINCT (p), collect(nodes(p)) AS x
ORDER BY length(p) DESC
LIMIT 5
我已經將Neo4j控制台設置為可在此處使用的沙箱: http ://console.neo4j.org/?id=pjf2qg
我掙扎着如何能夠從結果中刪除B節點
我最終只從路徑中提取了A標簽化的節點:
MATCH (a:A {name:'A1'}),(aa:A {name:'A8'}),
p = allShortestPaths((a)-[*]-(aa))
WITH DISTINCT(p) as pths, COLLECT(nodes(p)) as x
UNWIND(x) as u
WITH FILTER(s IN u WHERE 'A' IN labels(s)) AS zz, pths as paths
RETURN paths, zz
克里斯
我的第一個答案是通過一個有效的查詢進行編輯的。
順便說一句,當嘗試查找此查詢時,我發現以下內容:
當嘗試過濾節點(p)的集合而沒有展開時,標識符不被視為節點,而是被視為集合,我不知道這是否是預期的行為:
以下查詢將失敗,說明標識符s是一個集合,並且期望使用Node
MATCH (a:A {name:'A1'}),(aa:A {name:'A8'}),
p = allShortestPaths((a)-[*]-(aa))
WITH p as paths, COLLECT(nodes(p)) as x
WITH filter(s IN x WHERE 'A' IN labels(s)) AS zz
RETURN zz
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.