Cypher-запрос с выбором первого элемента из коллекции в neo4jclient - PullRequest
0 голосов
/ 27 марта 2020

У меня есть следующий код, но я не знаю, как это сделать в C# с помощью графического клиента. Меня смущают узлы 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());

1 Ответ

1 голос
/ 27 марта 2020

Вы, вероятно, захотите получить правильный класс результата вместо попытки анонимного типа для этого, поэтому, если у вас есть это:

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]
...