首页 > 解决方案 > 在 neo4jclient 中从收集中选择第一项的密码查询

问题描述

我有以下代码,但我不知道如何在 C# 中使用 graphclient。让我感到困惑的是 RETURN 节点[0]。

它所做的是它将返回具有不同名称值的所有节点及其属性。

PROFILE MATCH (t:Node { Mapped: true}) 
WITH t.name as t, collect(t) AS nodes
RETURN nodes[0]

当前的实现要求我获取所有内容,然后使用 LINQ 来获取不同的内容,但这比较慢:

 var res = graphClient.Cypher
                    .Match(match)
                    .Return(t => new
                    {
                        N = Return.As<string>("t.name")                       
                        LA = Return.As<double>("t.lat"),
                        LO = Return.As<double>("t.lon")
                    })
                    .OrderBy("t.name")
                    .Results;

//TODO: THE DISTINT NEEDS TO BE IN THE QUERY INSTEAD OF AFTER RESULT.
return res.Where(p => p.N != null).GroupBy(p => p.N).Select(grp => grp.FirstOrDefault());

标签: c#cypherneo4jclient

解决方案


您可能需要一个正确的结果类,而不是为此尝试匿名类型,所以如果您有这个:

public class Location{
    [JsonProperty("name")]
    public string Name {get;set;}
    [JsonProperty("lat")]
    public double Lat { get; set; }
    [JsonProperty("lon")]
    public double Lon { get; set; }
}

然后,您可以将查询编写为:

var query = client.Cypher
    .Match("(t:Node {Mapped: true})")
    .With("t.name AS t, collect(t) AS nodes")
    .Return(() => Return.As<Location>("nodes[0]"));

如果你看一下:

query.Query.DebugQueryText

你应该看到:

MATCH (t:Node {Mapped: true})
WITH collect(t) AS nodes
RETURN nodes[0]

推荐阅读