0

.NET 用の Neo4jClient を使用して、Neo4j で NameIndex に対してクエリを実行しようとしていますが、次のエラーが発生します。

{"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;
        }

理想的には NodeName をクエリに渡したいのですが、それが機能しないため、ハードコーディングしようとしましたが、それも機能しません。どちらのシナリオでも同じエラー メッセージが表示されますか?

4

1 に答える 1

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");

IGraphClient.Cypher常にorから Cypher クエリを開始しますNodeReference.StartCypher(これは前者へのショートカットです)。

メソッドには他にもいくつかの問題があります。

  1. 生を返していますIEnumerable。何が入っていますか?戻るべきIEnumerable<T>です。
  2. を呼び出していますquery.ToList()。それがコンパイルさえできれば、私は驚くでしょう。ToList列挙型がヒットするように結果を呼び出したいとします。
  3. C# では、ローカル変数はcamelCasenotにある必要があり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();
}
于 2013-03-28T13:05:17.323 に答える