I am trying to get started with Neo4j and the Neo4jClient; the first thing I'm trying to attempt is to insert a series of nodes with a publication_number property. Before inserting each node, I want to check to ensure another node with the same publication number does not exist. To this end I created an index for publication_number, which I then query.
This is the code I have so far. (Obviously all the logic above has not been implemented, but I can't even get this to work.)
class Program
{
static void Main(string[] args)
{
var client = new GraphClient(new Uri("http://192.168.12.31:7474/db/data"));
client.Connect();
// create index
client.CreateIndex("publication_number_idx", new IndexConfiguration
{
Provider = IndexProvider.lucene,
Type = IndexType.exact
},
IndexFor.Node);
// create record
Record record1 = new Record { publication_number = "1" };
Record record2 = new Record { publication_number = "2" };
// add record1 to graph and index
var record1Ref = client.Create(record1);
client.ReIndex(record1Ref, new[] { new IndexEntry ("publication_number_idx") { { "publication_number", record1.publication_number } } });
Console.WriteLine("Added record1 at {0}", record1Ref.Id);
// add record2 to graph and index
var record2Ref = client.Create( record2,
new[] { new Cites(record1Ref) { Direction = RelationshipDirection.Outgoing } },
new[] { new IndexEntry("publication_number_idx") { {"publication_number", record2.publication_number } } });
Console.WriteLine("Added record2 at {0}", record2Ref.Id);
// 500 error here
client.QueryIndex<Record>("publication_number_idx", IndexFor.Node, @"START n=node:publication_number_idx(publication_number = ""2"") RETURN n;");
}
}
public class Cites : Relationship, IRelationshipAllowingSourceNode<Record>, IRelationshipAllowingTargetNode<Record>
{
public Cites(NodeReference targetNode)
: base(targetNode)
{
}
public const string TypeKey = "CITES";
public override string RelationshipTypeKey
{
get { return TypeKey; }
}
}
I appear to be successful in adding the notes and updating the index. I am able to query the index using Cypher in the Console; however, when I use the same Cypher query with the Neo4J Client I get a 500 Internal Server Error on the query.
Unhandled Exception: System.ApplicationException: Received an unexpected HTTP status when executing the request.
The response status was: 500 Internal Server Error
The response from Neo4j (which might include useful detail!) was: {
"exception" : "NullPointerException", "fullname" : "java.lang.NullPointerException", "stacktrace" : [ "org.apache.lucene.util.SimpleStringInterner.intern(SimpleStringInterner.java:54)", "org.apache.lucen e.util.StringHelper.intern(StringHelper.java:39)", "org.apache.lucene.index.Term.(Term.java:38)", "org.apache.luce ne.queryParser.QueryParser.getFieldQuery(QueryParser.java:643)", "org.apache.lucene.queryParser.QueryParser.Term(QueryPa rser.java:1436)", "org.apache.lucene.queryParser.QueryParser.Clause(QueryParser.java:1319)", "org.apache.lucene.queryPar ser.QueryParser.Query(QueryParser.java:1245)", "org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java :1234)", "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.re st.web.DatabaseActions.getIndexedNodesByQuery(DatabaseActions.java:889)", "org.neo4j.server.rest.web.DatabaseActions.get IndexedNodesByQuery(DatabaseActions.java:872)", "org.neo4j.server.rest.web.RestfulGraphDatabase.getIndexedNodesByQuery(R estfulGraphDatabase.java:707)", "java.lang.reflect.Method.invoke(Method.java:606)", "org.neo4j.server.rest.security.Secu rityFilter.doFilter(SecurityFilter.java:112)" ] } at Neo4jClient.GraphClient.SendHttpRequest(HttpRequestMessage request, String commandDescription, HttpStatusCode[] ex pectedStatusCodes) in c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\GraphClient.cs:line 137 at Neo4jClient.GraphClient.QueryIndex[TNode](String indexName, IndexFor indexFor, String query) in c:\TeamCity\buildA gent\work\f1c4cf3efbf1b05e\Neo4jClient\GraphClient.cs:line 1168 at Antares.Program.Main(String[] args) in c:\Users\Yellick Chris\Documents\Visual Studio 2012\Projects\Antares\Antare s\Program.cs:line 41
I'm not sure what the 500 error is about, but the solution to getting your query to work is to remove the 'QueryIndex' call (which is obsolete) and replace it with the Cypher notation, so:
var query = client.Cypher
.Start(new {n = Node.ByIndexLookup("publication_number_idx", "publication_number", "2")})
.Return<Record>("n");
var results = query.Results;
The query used in 'QueryIndex' has a different format to yours, if you look at the Neo4jclient Index Documentation you'd need to replace things like the =
with :
and wrap with '
like so:
client.QueryIndex<Record>("publication_number_idx", IndexFor.Node, @"START n=node:publication_number_idx('publication_number: ""2""') RETURN n;");
Not that that fixes the 500 error.