我试图通过使用REST API在我的neo4j数据库上运行SPARQL查询。为了获得SPARQL端点,我安装了Noe4j SPARQL插件(https://github.com/neo4j-contrib/sparql-plugin)。我的系统现在公开这些SPARQL的端点:
Neo4j SPARQL插件REST用法
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”结果。我试图通过谷歌寻找解决方案,但我没有发现任何有用的东西。我怎样才能解决这个问题 ? Neo4j的1.9.2的 进出口使用的社区版上运行的Windows 7 安装SPARQL插件的版本是“0.2快照”
编辑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”是一些“蓝图-的Neo4j-graph.jar”的一部分。这个jar文件在我的sparql /文件夹中丢失了,所以我搜索了最近的jar文件并添加了“blueprints-neo4j-graph-2.5.0-20130916.151744-5.jar”。重新启动服务器后,错误不再出现,但我仍然得到“空”结果(在两个查询中的任一个)
编辑3:我也尝试将“BerlinDatasetTest.java”的某些部分从neof4 sparql-plugin的github页面并手动运行它(在添加所有必需的jar文件之后)。这是源代码:
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<? extends BindingSet, QueryEvaluationException> 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:它的出现,那结果就只有空,如果
query.getDataset()
成为空(这发生在两个查询),如果我添加一个FROM子句或开始使用中的网址WHERE-part,query.Dataset()不再是null,Im得到一个空结果(这不是null)。这些是两个“工作”查询:
select ?x from <localhost:7474> where { graph ?g { ?x ?y ?z } }
select ?x where { graph ?g { ?x <http://localhost:7474#knows> ?z } }
我仍然没有得到任何结果。
您实际预期会得到多少结果?如果使用查询'select?x where {graph?g {?x?y?z}}'查询会发生什么情况,这样您就可以搜索所有命名图表,而不仅仅是默认图表? (在某些端点中,默认图形是指定图形的联合,但在其他图形中并不是这样)。 –
我已经将一个2gb * .nt文件加载到neo4j中,所以我期望返回很多三元组;因此我添加了“限制5”。不幸的是,如果我使用你的查询,结果不会改变。 – mxh
您的查询似乎成功_running_(即,您得到非错误结果),所以它看起来像问题在别处。也许不是用2GB数据集运行,你可以设置一个简单的配置的简单例子,可能更容易调试? –