Cypher для Neo4JClient Distinct Collect

Я пытаюсь получить путь от базового узла к его корневому узлу в виде 1 строки. Запрос Cypher выглядит так:

start n = node:node_auto_index(Name = "user1") match path = (n-[r:IS_MEMBER_OF_GROUP*]->b) return last(collect(distinct path));

Но при изменении этого на синтаксис Neo4JClient:

var k = clientConnection.Cypher
                .Start(new { n = "node:node_auto_index(Name = 'user1')" })
                .Match("path = (n-[r:IS_MEMBER_OF_GROUP*]->b)")
                .ReturnDistinct<Node<Principles>>("last(collect(path))").Results;

Получается ошибка:

{"Value cannot be null.\r\nParameter name: uriString"}

При продолжении оттуда:

 Neo4jClient encountered an exception while deserializing the response from the server. This is likely a bug in Neo4jClient.



Please open an issue at https://bitbucket.org/Readify/neo4jclient/issues/new



To get a reply, and track your issue, ensure you are logged in on BitBucket before submitting.



Include the full text of this exception, including this message, the stack trace, and all of the inner exception details.



Include the full type definition of Neo4jClient.Node`1[[IQS_Neo4j_TestGraph.Nodes.Principles, IQS Neo4j TestGraph, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].



Include this raw JSON, with any sensitive values replaced with non-sensitive equivalents:



{

  "columns" : [ "last(collect(path))" ],

  "data" : [ [ {

    "start" : "http://localhost:7474/db/data/node/3907",

    "nodes" : [ "http://localhost:7474/db/data/node/3907", "http://localhost:7474/db/data/node/3906", "http://localhost:7474/db/data/node/3905", "http://localhost:7474/db/data/node/3904" ],

    "length" : 3,

    "relationships" : [ "http://localhost:7474/db/data/relationship/4761", "http://localhost:7474/db/data/relationship/4762", "http://localhost:7474/db/data/relationship/4763" ],

    "end" : "http://localhost:7474/db/data/node/3904"

  } ] ]

}

Как можно преобразовать шифрованный запрос в запрос Neo4JClient?


person Shaun Groenewald    schedule 13.09.2013    source источник


Ответы (1)


Что ж, вы возвращаете PathsResult, а не Node<>, поэтому, если вы измените свой запрос на:

 var k = clientConnection.Cypher
            .Start(new { n = "node:node_auto_index(Name = 'user1')" })
            .Match("path = (n-[r:IS_MEMBER_OF_GROUP*]->b)")
            .ReturnDistinct<PathsResult>("last(collect(path))").Results; //<-- Change here

вы получите результаты, это возвращает то, что я получаю от выполнения вашего запроса к моей базе данных, если вам конкретно нужны узлы в этом сообщении: Getting PathsResults охватывает преобразование в фактические узлы и связи.

Еще одна вещь (и это поможет запросу работать лучше, поскольку neo4j может проще кэшировать планы выполнения) заключается в том, что вы можете изменить свой start, чтобы он использовал параметры, выполнив:

.Start(new { n = Node.ByIndexLookup("node_auto_index", "Name", "user1")})
person Charlotte Skardon    schedule 13.09.2013
comment
Спасибо за ответ, это работает. Также совет, буду делать так в будущем. ОЧЕНЬ новичок в использовании Neo4J и шифра (например, день или 2 новых). - person Shaun Groenewald; 13.09.2013
comment
Одна вещь, которую я считаю весьма полезной, — это хранить запрос и результаты отдельно, чтобы я мог проверить правильность запроса, поэтому var query = client.Start(/**/).Return(/**/);, затем var results = query.Results; Затем вы можете поставить точку останова на var results и посмотреть, что представляет собой запрос, прежде чем выполнять его! - person Charlotte Skardon; 13.09.2013