代码之家  ›  专栏  ›  技术社区  ›  a1oleg

如何获取对象集合<边,顶点>Neo4jClient。净Cypher与C#

  •  0
  • a1oleg  · 技术社区  · 8 年前
        public IEnumerable<EdVeObj> Parse(string word)
        {
            var res = graphClient.Cypher.OptionalMatch($"(a{{name:'{word}'}})-[r]->(b)") 
            .Return((a, r, b) => new EdVeObj{RelUp = r.As<Edge>(), Target = b.<Vertex>()}).Results;            
            return res;
        }
        public class EdVeObj
        {                
            public Edge RelUp { get; set; }
            public Vertex Target { get; set; }
        }
    

    我需要遍历所有的输出边,得到一组对象:边加上它所到达的顶点。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Charlotte Skardon    8 年前

    这个问题并不十分清楚,但正如Gabor所提到的,如果你想迭代你的结果,你可以使用 foreach ,即:

    var results = Parse("word");
    foreach(var ev in results){
        //Do something with ev
    }
    

    for 循环-但你需要 .ToList() 结果:

    var results = Parse("word").ToList();
    for(int i = 0; i < results.Count; i++){
        //Do something with results[i]
    }
    

    你的 cypher 首先,将受益于一点调整-无需使用 OptionalMatch -你需要结果存在,如果那里什么都没有,那么它无论如何也不会返回任何结果。此外,你真的应该使用 label 至少在 a 节点。你也应该使用 parameters 从服务器获得更高的性能。

    我会将您的代码更改为:

    public IEnumerable<EdVeObj> Parse(string word)
    {
        var res = graphClient.Cypher
            .Match("(:YOUR_LABEL_HERE {name:$word})-[r]->(b)") 
            .WithParam("word", word)
            .Return((r, b) => new EdVeObj
                {
                    RelUp = r.As<Edge>(), 
                    Target = b.<Vertex>()
                })
            .Results;            
    
        return res;
    }
    

    在任何一个大的图表上,这将是相当长的一段时间:/