Neo4j SPARQL-plugin REST用法

我试图通过使用REST API在我的neo4j数据库上运行SPARQL查询。 为了获得SPARQL端点,我安装了Noe4j SPARQL插件( https://github.com/neo4j-contrib/sparql-plugin )。 我的系统现在公开了这些sparql-endpoints:

http://localhost:7474/db/data/ext/SPARQLPlugin/graphdb/insert_quad http://localhost:7474/db/data/ext/SPARQLPlugin/graphdb/execute_sparql 

我试图使用sencond执行查询。 HTTP POST请求应该与http://neo4j-contrib.github.io/sparql-plugin/中的 “示例2”类似,但查询稍微容易一些。 这是源代码:

 private static final String ENDPOINT = "http://localhost:7474/db/data/ext/SPARQLPlugin/graphdb/execute_sparql"; private static String query = "SELECT ?x WHERE {?x ?y ?z} LIMIT 5"; public static void main(String[] args) { try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(ENDPOINT); // Request parameters and other properties. httppost.addHeader(new BasicHeader("Method", "POST")); httppost.addHeader(new BasicHeader("Accept", "application/json")); httppost.addHeader(new BasicHeader("Content-Type", "application/json")); JSONObject holder = new JSONObject(); holder.put("query", query); System.out.println(holder.toString()); httppost.setEntity(new StringEntity(holder.toString())); //Execute and get the response. HttpResponse response = httpclient.execute(httppost); System.out.println("HEADER:"); System.out.println("Status code : " + response.getStatusLine().getStatusCode()); Header[] hlist = response.getAllHeaders(); for (int i = 0; i < hlist.length; i++) { System.out.print(hlist[i].getName() + " "); System.out.println(hlist[i].getValue()); } System.out.println("-----"); HttpEntity entity = response.getEntity(); if (entity != null) { BufferedReader rd = new BufferedReader( new InputStreamReader(entity.getContent())); String line = ""; while ((line = rd.readLine()) != null) { System.out.println("x " + line); } } else { System.out.println("Entity is null"); } } catch (Exception e) { e.printStackTrace(System.out); } } 

不幸的是,我没有得到所需的输出。 输出是:

 {"query":"SELECT ?x WHERE {?x ?y ?z} LIMIT 5"} HEADER: Status code : 200 Content-Length 4 Content-Type application/json; charset=UTF-8 Access-Control-Allow-Origin * Server Jetty(6.1.25) ----- x null 

我很确定这个SPARQL查询是正确的; 在安装sparqpl-plugin时我也没有注意到任何问题,所以我不知道为什么我得到“null”作为结果。 我试过通过谷歌寻找解决方案,但我没有找到任何有用的东西。 我怎样才能解决这个问题 ? 我正在使用在Windows 7上运行的Neo4j 1.9.2社区版安装的sparql插件的版本是“0.2 SNAPSHOT”

编辑1:如果我运行此查询:

 SELECT ?x WHERE {?x ?y ?z} LIMIT 0 

输出是:

 {"query":"SELECT ?x WHERE {?x ?y ?z} LIMIT 0"} HEADER: Status code : 200: OK Content-Length 3 Content-Type application/json; charset=UTF-8 Access-Control-Allow-Origin * Server Jetty(6.1.25) ----- x [ ] 

也许这有助于发现错误。

我也试过从Neo4j的HTTP控制台运行查询:

 http> POST http://localhost:7474/db/data/ext/SPARQLPlugin/graphdb/execute_sparql {"query":"select ?x where { graph ?g { ?x ?y ?z } }"} ==> 200 OK ==> null http> POST http://localhost:7474/db/data/ext/SPARQLPlugin/graphdb/execute_sparql {"query":"select ?x where { ?x ?y ?z }"} ==> 200 OK ==> null 

编辑2:我试图重新下载并构建插件。 之后我通过在NEO4J_HOME / plugins / sparql中解压缩它来安装它。 然后,在我启动Neo4j.bat之后,我执行了我的java代码。 控制台出现以下错误:

 x { x "message" : "com/tinkerpop/blueprints/impls/neo4j/Neo4jGraph", x "exception" : "NoClassDefFoundError", x "fullname" : "java.lang.NoClassDefFoundError", x "stacktrace" : [ "org.neo4j.server.plugin.sparql.SPARQLPlugin.initSail(SPARQLPlugin.java:90)", "org.neo4j.server.plugin.sparql.SPARQLPlugin.executeSPARQL(SPARQLPlugin.java:61)", "java.lang.reflect.Method.invoke(Unknown Source)", "org.neo4j.server.plugins.PluginMethod.invoke(PluginMethod.java:57)", "org.neo4j.server.plugins.PluginManager.invoke(PluginManager.java:168)", "org.neo4j.server.rest.web.ExtensionService.invokeGraphDatabaseExtension(ExtensionService.java:300)", "org.neo4j.server.rest.web.ExtensionService.invokeGraphDatabaseExtension(ExtensionService.java:122)", "java.lang.reflect.Method.invoke(Unknown Source)", "org.neo4j.server.rest.security.SecurityFilter.doFilter(SecurityFilter.java:112)" ], x "cause" : { x "message" : "com.tinkerpop.blueprints.impls.neo4j.Neo4jGraph", x "exception" : "ClassNotFoundException", x "stacktrace" : [ "java.net.URLClassLoader$1.run(Unknown Source)", "java.net.URLClassLoader$1.run(Unknown Source)", "java.security.AccessController.doPrivileged(Native Method)", "java.net.URLClassLoader.findClass(Unknown Source)", "java.lang.ClassLoader.loadClass(Unknown Source)", "sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)", "java.lang.ClassLoader.loadClass(Unknown Source)", "org.neo4j.server.plugin.sparql.SPARQLPlugin.initSail(SPARQLPlugin.java:90)", "org.neo4j.server.plugin.sparql.SPARQLPlugin.executeSPARQL(SPARQLPlugin.java:61)", "java.lang.reflect.Method.invoke(Unknown Source)", "org.neo4j.server.plugins.PluginMethod.invoke(PluginMethod.java:57)", "org.neo4j.server.plugins.PluginManager.invoke(PluginManager.java:168)", "org.neo4j.server.rest.web.ExtensionService.invokeGraphDatabaseExtension(ExtensionService.java:300)", "org.neo4j.server.rest.web.ExtensionService.invokeGraphDatabaseExtension(ExtensionService.java:122)", "java.lang.reflect.Method.invoke(Unknown Source)", "org.neo4j.server.rest.security.SecurityFilter.doFilter(SecurityFilter.java:112)" ], x "fullname" : "java.lang.ClassNotFoundException" x } x } 

我发现,“com.tinkerpop.blueprints.impls.neo4j.Neo4jGraph”是一些“blueprints-neo4j-graph.jar”的一部分。 我的sparql /文件夹中缺少此jar文件,因此我搜索了最新的jar文件并添加了“blueprints-neo4j-graph-2.5.0-20130916.151744-5.jar”。 重新启动服务器后,错误不再出现,但我仍然得到“null”结果(在两个查询中的任何一个)

编辑3:我还尝试从neof4 sparql-plugin的github页面中编写“BerlinDatasetTest.java”的某些部分并手动运行它(在添加所有必需的jar文件后的ofc)。 这是源代码:

 public String runQuery(String raw_query) { String q_result = ""; Sail sail = new GraphSail( new Neo4jGraph("my_db/") ); try { sail.initialize(); QueryParser parser = new SPARQLParserFactory().getParser(); ParsedQuery query = null; CloseableIteration sparqlResults; SailConnection conn = sail.getConnection(); query = parser.parseQuery(raw_query, "http://localhost:7474"); sparqlResults = conn.evaluate( query.getTupleExpr(), query.getDataset(), new EmptyBindingSet(), false ); while ( sparqlResults.hasNext() ) { q_result += "; " + sparqlResults.next(); } conn.close(); sail.shutDown(); } catch (Exception e) { e.printStackTrace(); } return q_result; } 

这是我得到的结果

 java.lang.NullPointerException at com.tinkerpop.blueprints.oupls.sail.GraphSailConnection.toSesame(GraphSailConnection.java:729) at com.tinkerpop.blueprints.oupls.sail.GraphSailConnection.fillStatement(GraphSailConnection.java:636) at com.tinkerpop.blueprints.oupls.sail.GraphSailConnection.access$800(GraphSailConnection.java:36) at com.tinkerpop.blueprints.oupls.sail.GraphSailConnection$StableStatementIteration.next(GraphSailConnection.java:624) at com.tinkerpop.blueprints.oupls.sail.GraphSailConnection$StableStatementIteration.next(GraphSailConnection.java:589) at info.aduna.iteration.IterationWrapper.next(IterationWrapper.java:71) at net.fortytwo.sesametools.QueryEvaluationIteration.next(QueryEvaluationIteration.java:45) at net.fortytwo.sesametools.QueryEvaluationIteration.next(QueryEvaluationIteration.java:16) at info.aduna.iteration.IterationWrapper.next(IterationWrapper.java:71) at info.aduna.iteration.FilterIteration.findNextElement(FilterIteration.java:69) at info.aduna.iteration.FilterIteration.hasNext(FilterIteration.java:43) at info.aduna.iteration.ConvertingIteration.hasNext(ConvertingIteration.java:62) at info.aduna.iteration.ConvertingIteration.hasNext(ConvertingIteration.java:62) at info.aduna.iteration.IterationWrapper.hasNext(IterationWrapper.java:57) at org.openrdf.sail.helpers.SailBaseIteration.hasNext(SailBaseIteration.java:50) at src.QueryTest.runQuery(QueryTest.java:113) at src.QueryTest.main(QueryTest.java:140) 

“QueryTest.java”是我运行此函数的java类的名称。

编辑4:看来,结果只有null,如果

 query.getDataset() 

变为null(在两个查询中都会发生)如果我添加一个FROM子句或开始使用WHERE-part内的URL,则query.Dataset()不再为null,并且我得到一个空结果(isnt null)。 这是两个“工作”查询:

 select ?x from  where { graph ?g { ?x ?y ?z } } select ?x where { graph ?g { ?x  ?z } } 

我还是没有得到任何结果。

我正在运行4节点集群。 ClassNotFoundException的修复非常简单。

  1. 您复制的gremlin插件文件夹包含旧版本(1.2)的blueprints-core和blueprints-neo4j-graph。 删除gremlin插件目录下的那些旧库。

  2. 更新sparql插件项目的pom.xml以包含最新的蓝图库。 触发maven构建(mvn clean包)。 现在将neo4j-sparql-plugin-0.2-SNAPSHOT-server-plugin.zip解压缩到gremlin目录中。 确保你有最新的蓝图-neo4j-graph-2.3.0.jar。

尝试

现在您的API应该可以使用,您可以将Neo4j视为一个完整的三元组。 玩得开心!