簡體   English   中英

Neo4j:如何從不同的起始節點返回多個路徑

[英]Neo4j: How to return multiple paths from different starting nodes

我有一個與問題類似的問題,但是我將c#與neo4jClient而不是Java一起使用。

我可以使用以下代碼獲取給定節點的父路徑,但是當嘗試查找許多節點的父路徑時,它成為性能瓶頸。 我想要的是一種通過節點鍵列表一次調用圖形數據庫並獲取父路徑列表的方法。 這樣我就可以返回結果字典,而不是單個列表。

任何幫助實現這一目標將不勝感激! 另外,如果我的原始密碼查詢可以改進,我也很樂意。

    public IEnumerable<IGenericEntity> GetPath(string entityCompositeKey, GraphRelationship relationship)
    {
        var entity = new GenericEntity();
        entity.setCompositeKey(entityCompositeKey);
        var pathToRoot = new List<GenericEntity>(){ entity };

        var query = new CypherFluentQuery(graphClient)
                    .Match("p = (current)-[r:" + relationship.Name + "*0..]->()")
                    .Where((IGenericEntity current) => current.CompositeKey == entityCompositeKey)
                    .Return(() => Return.As<IEnumerable<GenericEntity>>("nodes(p)"))
                    .OrderByDescending("length(p)")
                    .Limit(10);

        var queryText = query.Query.QueryText;
        var paramText = query.Query.QueryParameters;
        if (query.Results != null)
        {
            var graphResults = query.Results.FirstOrDefault();
            if (graphResults != null && graphResults.ToList().Count > 0)
            {
                pathToRoot = graphResults.ToList();
            }
        }
        return pathToRoot;
    }

我不確定有幾件事-這很可能是我的測試數據庫的設置方式。

要回答有關如何傳遞多個起始節點的最初問題-最好使用UNWIND運算符來實現,在Neo4jClient ,該運算符的用法如下:

var enumerable = new string[] { "a", "b" }
client.Unwind(enumerable, "item"). /*The rest*/

Obvs,如果你將在你的當前查詢的頂部,你會得到一個怪物組節點回來了,你不會知道這Root實體是指, ......讓我們做一些突出...

要進行投影,我們必須將某些東西投影到:

public class Result {
    public GenericEntity Root { get; set; }
    public List<GenericEntity> Nodes { get; set; }
    public int Length { get; set; }
}

現在將包含“ Root節點及其路徑。

public IEnumerable<Result> GetPath(IEnumerable<string> rootKeys, GraphRelationship relationship)
{
    var query = new CypherFluentQuery(Client)
                .Unwind(rootKeys, "entityRootKey")
                .Match(string.Format("p = (root)-[r:{0}*0..]->()", relationship.Name))
                .Where("root.CompositeKey = entityRootKey")
                .With("{Root:root, Nodes: nodes(p), Length: length(p)} as res")
                .Return((res) => res.As<Result>())
                .OrderByDescending("res.Length")
                .Limit(10);

    var results = query.Results;
    return results;
}

我沒有使用.Where和創建Func<T>的參數,這是因為該參數是在.Unwind語句中創建的。

明智的用法-像這樣:

var res = GetPath(new[] {"a", "b"}, new GraphRelationship {Name = "RELATED"});
foreach (var result in res)
{
    Console.WriteLine($"{result.Root.CompositeKey} => {result.Length}");
    foreach (var node in result.Nodes)
        Console.WriteLine($"\t{node.CompositeKey}");
}

暫無
暫無

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

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