簡體   English   中英

如何使用密碼檢索我的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.

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