2013-03-28 155 views
0

我尝试使用Neo4jClient为.NET中的Neo4j我NameIndex执行查询执行索引的Cypher查询,但我得到这个错误:挣扎在Neo4jClient.NET

{"Received an unexpected HTTP status when executing the request.\r\n\r\nThe response status was: 500 Internal Server Error\r\n\r\nThe raw response body was: {\"exception\":\"NullPointerException\",\"stacktrace\":[\"org.apache.lucene.util.SimpleStringInterner.intern(SimpleStringInterner.java:54)\",\"org.apache.lucene.util.StringHelper.intern(StringHelper.java:39)\",\"org.apache.lucene.index.Term.<init>(Term.java:38)\",\"org.apache.lucene.queryParser.QueryParser.getFieldQuery(QueryParser.java:643)\",\"org.apache.lucene.queryParser.QueryParser.Term(QueryParser.java:1421)\",\"org.apache.lucene.queryParser.QueryParser.Clause(QueryParser.java:1309)\",\"org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1237)\",\"org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java:1226)\",\"org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:206)\",\"org.neo4j.index.impl.lucene.IndexType.query(IndexType.java:300)\",\"org.neo4j.index.impl.lucene.LuceneIndex.query(LuceneIndex.java:227)\",\"org.neo4j.server.rest.web.DatabaseActions.getIndexedNodesByQuery(DatabaseActions.java:977)\",\"org.neo4j.server.rest.web.DatabaseActions.getIndexedNodesByQuery(DatabaseActions.java:960)\",\"org.neo4j.server.rest.web.RestfulGraphDatabase.getIndexedNodesByQuery(RestfulGraphDatabase.java:692)\",\"java.lang.reflect.Method.invoke(Unknown Source)\"]}"} 

我的方法如下所示:

public IEnumerable GraphGetNodeByName(string NodeName) 
     { 
      GraphOperationsLogger.Trace("Now entering GraphGetNodeByName() method"); 

      IEnumerable QueryResult = null; 


       GraphOperationsLogger.Trace("Now performing the query"); 
       var query = client_connection.QueryIndex<GraphNode>("NameIndex", IndexFor.Node, 
       //Here I want to pass in the NodeName into the query 
       //@"Start n = node:NameIndex(Name = '"+ NodeName +"') return n;"); 
       //Here I am hard-coding the NodeName 
        @"Start n = node:NameIndex(Name = ""Mike"") return n;"); 
       QueryResult = query.ToList(); 


      return QueryResult; 
     } 

我非常想在节点名传递到查询,但不工作,因此我试图硬编码的,并且也不起作用。两种情况都会产生相同的错误信息?

回答

3

您拨打的方法,IGraphClient.QueryIndex不是Cypher方法。这是http://docs.neo4j.org/chunked/milestone/rest-api-indexes.html#rest-api-find-node-by-query的包装。这是Cypher公司存在之前的一个较老的API。

你已经是半路上出现,但因为你的代码注释包括Cypher支架查询:

Start n = node:NameIndex(Name = "Mike") 
return n; 

那么,就让我们翻译成C#:

client 
    .Cypher 
    .Start(new CypherStartBitWithNodeIndexLookup("n", "NameIndex", "Name", "Mike")) 
    .Return<Node<Person>>("n"); 

始终启动的Cypher查询从IGraphClient.CypherNodeReference.StartCypher(这只是前者的捷径)。

还有一些其他的问题,与你的方法:

  1. 你返回原IEnumerable。里边啥啊?您应该返回IEnumerable<T>
  2. 你在致电query.ToList()。如果甚至编译,我会感到惊讶。你想对结果调用ToList,以便枚举被打中。
  3. 在C#中,您的局部变量应该在camelCase而不是PascalCase。即,queryResult而不是QueryResults

结合所有这些点,你的方法应该是:

public IEnumerable<Person> GetPeopleByName(string name) 
{ 
    return graphClient 
     .Cypher 
     .Start(new CypherStartBitWithNodeIndexLookup("n", "NameIndex", "Name", "Mike")) 
     .Return<Node<Person>>("n") 
     .Results 
     .ToList(); 
} 
+0

谢谢哥们,你肯定是不错的。什么是Neo4jClient for .NET的最新版本? –

+0

最新版本列于http://nuget.org/packages/Neo4jClient。我们经常发布 - 有时每天多次发布。查看该页面上的版本历史记录表。 –