2013-09-13 3 views
2

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

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" 

    } ] ] 

} 

Ho w может преобразовать запрос cypher в запрос Neo4JClient?

ответ

3

Ну, что вы возвращаете это 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 

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

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

.Start(new { n = Node.ByIndexLookup("node_auto_index", "Name", "user1")}) 
+0

Спасибо за ответ, он работает. Также подсказка сделает это в будущем. ОЧЕНЬ новый для использования Neo4J и cypher (например, день или 2 новых). –

+2

Одна вещь, которую я нахожу весьма полезной, заключается в том, чтобы хранить запрос и результаты отдельно - так что я могу проверить правильность запроса, так что 'var query = client.Start (/ ** /). Return (/ ** /);' то «var results = query.Results;» Затем вы можете поставить точку останова на «var results» и посмотреть, что представляет собой запрос перед его выполнением! –

Смежные вопросы