2013-09-26 78 views
0

我試圖通過使用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 } } 

我仍然沒有得到任何結果。

+1

您實際預期會得到多少結果?如果使用查詢'select?x where {graph?g {?x?y?z}}'查詢會發生什麼情況,這樣您就可以搜索所有命名圖表,而不僅僅是默認圖表? (在某些端點中,默認圖形是指定圖形的聯合,但在其他圖形中並不是這樣)。 –

+0

我已經將一個2gb * .nt文件加載到neo4j中,所以我期望返回很多三元組;因此我添加了「限制5」。不幸的是,如果我使用你的查詢,結果不會改變。 – mxh

+0

您的查詢似乎成功_running_(即,您得到非錯誤結果),所以它看起來像問題在別處。也許不是用2GB數據集運行,你可以設置一個簡單的配置的簡單例子,可能更容易調試? –

回答

1

我正在運行4節點集羣。 ClassNotFoundException的修復非常簡單。

  1. 您複製的gremlin插件文件夾包含blueprints-core和blueprints-neo4j-graph的舊版本(1.2)。在gremlin插件目錄下刪除那些舊的庫。

  2. 更新sparql plugin項目的pom.xml以包含最新的藍圖庫。觸發一個maven構建(mvn clean package)。現在將neo4j-sparql-plugin-0.2-SNAPSHOT-server-plugin.zip解壓縮到gremlin目錄中。確保你有最新的藍圖-neo4j-graph-2.3.0.jar。

嘗試

現在你的API應該工作,你可以把你的Neo4j作爲一個完全成熟的triplestore。玩的開心!