Вернуть все узлы кратчайшего пути в виде списка объектов

У меня есть следующий Cypher Query, который отлично работает в Neo4j 2.0.0.

MATCH (ab:Point { Latitude: 24.96325, Longitude: 67.11343 }),(cd:Point { Latitude: 24.95873, Longitude: 67.10335 }),
p = shortestPath((ab)-[*..150]-(cd))
RETURN p

Следующий запрос в Neo4jClient выдает ошибку: Time Evaluation Time out.

var pathsQuery =
            client.Cypher
            .Match("(ab:Point { Latitude: 24.96325, Longitude: 67.11343 }),(cd:Point { Latitude: 24.95873, Longitude: 67.10335 }), p = shortestPath((ab)-[*..150]-(cd))")
            .Return<IEnumerable<PointEntity>>("extract(n in nodes(p) : id(n))");

И после прочтения другой похожей работы над Xclave:

http://geekswithblogs.net/cskardon/archive/2013/07/23/neo4jclient-ndash-getting-path-results.aspx

Значение результатов: Время ожидания оценки функции истекло.

var pathsQuery =
            client.Cypher
            .Match("(ab:Point { Latitude: 24.96325, Longitude: 67.11343 }),(cd:Point { Latitude: 24.95873, Longitude: 67.10335 }), p = shortestPath((ab)-[*..150]-(cd))")
            .Return(p => new PathsResult<PointEntity>
                {
                    Nodes = Return.As<IEnumerable<Node<PointEntity>>>("nodes(p)"),
                });

Как я могу получить все узлы, возвращаемые запросом на С#, в виде списка типов PointEntity?

ИЗМЕНИТЬ:

Мне удалось получить URI узлов и отношений из этого кода:

var pathsQuery =
            client.Cypher
            .Match("(ab:Point { Latitude: 24.96325, Longitude: 67.11343 }),(cd:Point { Latitude: 24.95873, Longitude: 67.10335 }), p = shortestPath((ab)-[*..150]-(cd))")
var results = pathsQuery.Return<PathsResult>("p").Results;

Следите за блогом Крейга Бретта здесь: http://craigbrettdevden.blogspot.co.uk/2013/03/retrieving-paths-in-neo4jclient.html

Я попытался получить POCO, но получил ошибку:

var paths = pathsQuery.Returns<PathsResult>("EXTRACT(n in nodes(p) : n) AS Nodes, EXTRACT(rel in rels(p) : rel) AS Relationships", CypherResultMode.Projection).Results;

Ошибка:

'Neo4jClient.Cypher.ICypherFluentQuery' does not contain a definition for 'Returns' and no extension method 'Returns' accepting a first argument of type 'Neo4jClient.Cypher.ICypherFluentQuery' could be found (are you missing a using directive or an assembly reference?)

person Saad Farooq    schedule 14.12.2013    source источник


Ответы (1)


Я не могу сказать, почему первый запрос не работает, я не могу проверить его прямо сейчас, так как моя версия Neo4j не позволяет мне использовать параметры в моем предложении MATCH. Однако моя версия (ниже) работает нормально. С точки зрения тайм-аута, [*..150] — довольно большой потенциальный обход.

не могли бы вы попробовать запустить:

var pathsQuery =
    Client.Cypher
        .Match("p = shortestPath((ab:Point)-[*..150]-(cd:Point))")
        .Where((PointEntity ab) => ab.Latitude == 24.96325)
        .AndWhere((PointEntity ab) => ab.Longitude == 67.11343)
        .AndWhere((PointEntity cd) => cd.Latitude == 24.95873)
        .AndWhere((PointEntity cd) => cd.Longitude == 67.10335)

        .Return(p => new PathsResult<PointEntity>
                        {
                            Nodes = Return.As<IEnumerable<Node<PointEntity>>>("nodes(p)"),
                            Relationships = Return.As<IEnumerable<RelationshipInstance<object>>>("rels(p)")
                        });

var res = pathsQuery.Results;

Где PathsResult определяется как:

public class PathsResult<TNode> 
{
    public IEnumerable<Node<TNode>> Nodes { get; set; }
    public IEnumerable<RelationshipInstance<object>> Relationships { get; set; }
}

Преимущество здесь в том, что предложения WHERE параметризованы.

person Charlotte Skardon    schedule 15.12.2013