簡體   English   中英

java中的並發gremlin-server和graph查詢

[英]Concurrent gremlin-server and graph queries in java

我正在用TinkerPop3編寫Java應用程序。 它與Neo4j圖進行通信,並使用neo4j-gremlin 3.0.0.M7庫通過Gremlin發送讀/寫查詢。

同時,我想使用gremlin-server 3.0.0.M7通過HTTP提供此圖。 另外,這些操作完全正常。 但是,由於不允許多個連接(即GremlinServer對象和Java代碼都試圖獲取圖上的鎖),似乎不可能同時進行此操作。

當然,解決方法可能涉及從Java程序中創建客戶端並將其連接到服務器。 但是,我寧願消除這引入的通信開銷。

最大的問題是:這有可能嗎?

為了完整起見,這是我的最小代碼。 請注意,我的gremlin-server-neo4j.yaml引用了標准包含的neo4j-empty.properties文件,其中包含與我的Java代碼中的Neo4jGraph對象相同的neo4j圖形數據目錄(即/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

正如您所發現的那樣,您嘗試做的事情將無法工作,因為兩個獨立的進程無法在嵌入式Neo4jGraph 目前你不能從GremlinServer對象訪問配置的圖形實例,我不確定我是否會改變它,因為我不完全確定這是一個對每個人都有用的功能。

在我看來,你需要的是一種“初始化” Graph實例的方法。 如果是這樣,那么Gremlin Server提供了一種方法。 您可以在yaml文件中提供初始化腳本(以下是來自conf/gremlin-server-classic.yaml的片段,它與Gremlin Server發行版一起打包)。

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

請注意“腳本”鍵,它允許您提供要執行的腳本文件。 這些腳本將使您可以訪問“g”(或您配置的任何圖形)。 對於此示例, scripts/generate-classic.groovy只有:

TinkerFactory.generateClassic(g)

通過這種方式,您可以在Graph上完成所有初始化工作,這些工作最終將由Gremlin Server在啟動時托管,然后可以使用bin/gremlin-server.sh以標准方式啟動它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM