使用 select 第一项从 neo4jclient 中收集的 Cypher 查询

Cypher query with select first item from collect in neo4jclient

我有以下代码,但我不知道如何使用 graphclient 在 C# 中执行它。令我困惑的是 RETURN 个节点[0]。

它的作用是 return 所有节点及其属性具有不同的名称值。

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());

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

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]