0

REST API を使用して、neo4j データベースで SPARQL クエリを実行しようとしています。SPARQL エンドポイントを取得するために、Noe4j SPARQL プラグイン ( https://github.com/neo4j-contrib/sparql-plugin ) をインストールしました。私のシステムは、これらの sparql エンドポイントを公開するようになりました。

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」になる理由がわかりません。Googleで解決策を探してみましたが、役立つものは何も見つかりませんでした. どうすればこれを修正できますか? Windows 7 で実行されている Neo4j 1.9.2の Community-Edition を使用しています インストールされている 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」の一部であることがわかりました。この jar ファイルが sparql/ フォルダーになかったので、最新の jar ファイルを検索し、「blueprints-neo4j-graph-2.5.0-20130916.151744-5.jar」を追加しました。サーバーを再起動した後、エラーは発生しなくなりましたが、結果として「null」が返され

ます(両方のクエリのいずれかで)。 neof4 sparql-plugin を手動で実行します (必要なすべての 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<? 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:結果が null のみであるように見えます。

query.getDataset()

null になります (両方のクエリで発生します) FROM 句を追加するか、WHERE 部分内で URL を使用し始めると、query.Dataset() は null ではなくなり、空の結果 (null ではない) が返されます。これらは、「機能する」クエリの 2 つです。

select ?x from <localhost:7474> where { graph ?g { ?x ?y ?z } } 
select ?x where { graph ?g { ?x <http://localhost:7474#knows> ?z } } 

いまだに結果が出ません。

4

1 に答える 1

1

4 ノード クラスターを実行しています。ClassNotFoundException の修正は非常に簡単です。

  1. コピーした gremlin プラグイン フォルダーには、古いバージョン (1.2) の blueprints-core と blueprints-neo4j-graph が含まれています。gremlin プラグイン ディレクトリにある古いライブラリを削除します。

  2. sparql プラグイン プロジェクトの pom.xml を更新して、最新のブループリント ライブラリを含めます。Maven ビルド (mvn クリーン パッケージ) をトリガーします。次に、neo4j-sparql-plugin-0.2-SNAPSHOT-server-plugin.zip を gremlin ディレクトリに抽出します。最新の blueprints-neo4j-graph-2.3.0.jar があることを確認してください。

試す

これで API が機能し、Neo4j を本格的なトリプルストアとして扱うことができます。楽しむ!

于 2013-10-16T04:22:02.530 に答える