1

TinkerPop3 で Java アプリケーションを作成しています。Neo4j グラフと通信し、neo4j-gremlin 3.0.0.M7ライブラリを使用して Gremlin を介して読み取り/書き込みクエリを送信します。

同時に、このグラフを を使用して HTTP 経由で利用できるようにしたいと考えていますgremlin-server 3.0.0.M7。これとは別に、これらの操作は完全に正常に機能します。ただし、複数の接続が許可されていない (つまり、GremlinServerオブジェクトと Java コードの両方がグラフのロックを取得しようとする) ため、これを同時に行うことはできないようです。

もちろん、回避策として、Java プログラム内からクライアントを作成し、それをサーバーに接続する必要があります。ただし、これがもたらす通信オーバーヘッドをなくしたいと思います。

大きな疑問: これは可能ですか?

完全を期すために、ここに私の最小限のコードを示します。my は、Java コードの Neo4jGraph オブジェクト (つまり ) と同じ neo4j グラフ データ ディレクトリを含む、gremlin-server-neo4j.yaml標準で含まれるファイルを参照することに注意してください。neo4j-empty.properties/tmp/neo4j

import com.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
import com.tinkerpop.gremlin.server.GremlinServer;
import com.tinkerpop.gremlin.server.Settings;    

public class Main {

    Neo4jGraph g;
    GremlinServer s;

    public static void main (String[] argv) {
        new Main().start();
    }

    private void start () {

        try {
            Settings settings = Settings.read(getClass().getResourceAsStream("/gremlin-server-neo4j.yaml"));
            s = new GremlinServer(settings);
            s.run();
        } catch (Exception e) {
            e.printStackTrace();
        }

        g = Neo4jGraph.open("/tmp/neo4j");

        // Gremlin code here

        g.close();
        s.stop();
    }
}

そして最後に、例外:

Exception in thread "main" java.lang.RuntimeException: Error starting org.neo4j.kernel.EmbeddedGraphDatabase, /tmp/neo4j
    at com.tinkerpop.gremlin.neo4j.structure.Neo4jGraph.<init>(Neo4jGraph.java:160)
    at com.tinkerpop.gremlin.neo4j.structure.Neo4jGraph.open(Neo4jGraph.java:175)
    at com.tinkerpop.gremlin.neo4j.structure.Neo4jGraph.open(Neo4jGraph.java:184)
    at org.test.Main.start(Main.java:33)
    at org.test.Main.main(Main.java:15)
Caused by: java.lang.RuntimeException: Error starting org.neo4j.kernel.EmbeddedGraphDatabase, /tmp/neo4j
    at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:366)
    at org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:59)
    at org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:91)
    at org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:181)
    at com.tinkerpop.gremlin.neo4j.structure.Neo4jGraph.<init>(Neo4jGraph.java:133)
    ... 4 more
Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.kernel.StoreLockerLifecycleAdapter@67ec8477' was successfully initialized, but failed to start. Please see attached cause exception.
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:513)
    at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:115)
    at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:343)
    ... 8 more
Caused by: org.neo4j.kernel.StoreLockException: Unable to obtain lock on store lock file: /tmp/neo4j/store_lock. Please ensure no other process is using this database, and that the directory is writable (required even for read-only access)
    at org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:82)
    at org.neo4j.kernel.StoreLockerLifecycleAdapter.start(StoreLockerLifecycleAdapter.java:44)
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:507)
    ... 10 more
Caused by: java.io.IOException: Unable to lock org.neo4j.kernel.impl.nioneo.store.StoreFileChannel@baf1bb3
    at org.neo4j.kernel.impl.nioneo.store.FileLock.wrapFileChannelLock(FileLock.java:38)
    at org.neo4j.kernel.impl.nioneo.store.FileLock.getOsSpecificFileLock(FileLock.java:93)
    at org.neo4j.kernel.DefaultFileSystemAbstraction.tryLock(DefaultFileSystemAbstraction.java:93)
    at org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:74)
    ... 12 more
4

1 に答える 1

3

あなたが見つけたように、あなたがやろうとしていることがうまくいかないのは、2つの別々のプロセスが埋め込まれNeo4jGraphた. 現状では、オブジェクトから構成されたグラフ インスタンスにアクセスすることはできませんGremlinServer。これがすべての人にとって役立つ機能であるかどうか完全にはわからないため、これを変更するかどうかはわかりません。

Graph必要なのは、インスタンスを「初期化」する方法のようです。もしそうなら、Gremlin Server はそれを行う方法を提供します。yaml ファイルで初期化スクリプトを指定できます (以下は、conf/gremlin-server-classic.yamlGremlin Server ディストリビューションにパッケージ化されているスニペットです)。

scriptEngines: {
  gremlin-groovy: {
    imports: [java.lang.Math],
    staticImports: [java.lang.Math.PI],
    scripts: [scripts/generate-classic.groovy]}}

実行するスクリプト ファイルを指定できる "scripts" キーに注意してください。これらのスクリプトは、「g」(または構成したグラフ) へのアクセスを提供します。この例でscripts/generate-classic.groovyは、次のとおりです。

TinkerFactory.generateClassic(g)

このようにしてGraph、Gremlin Server の起動時に最終的にホストされる ですべての初期化作業を行うことができ、その後、 を使用して標準的な方法ですべてを簡単に起動できますbin/gremlin-server.sh

于 2015-02-10T13:54:57.870 に答える