首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中并发gremlin服务器和图形查询

java中并发gremlin服务器和图形查询
EN

Stack Overflow用户
提问于 2015-02-10 12:58:54
回答 1查看 1K关注 0票数 1

我正在用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文件,其中包含与neo4j-empty.properties代码中的Neo4jGraph对象相同的neo4j图形数据目录(即/tmp/neo4j)。

代码语言:javascript
复制
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();
    }
}

最后,例外是:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-10 13:54:57

正如您已经发现的,您试图做的工作将无法工作,因为两个单独的进程不能在嵌入式Neo4jGraph上工作。就目前情况而言,您无法从GremlinServer对象访问配置好的图形实例,而且我不确定我是否会更改它,因为我不能完全确定这是一个对每个人都有用的特性。

在我看来,您需要的是一种“初始化”Graph实例的方法。如果是这样的话,Gremlin就提供了一种这样做的方法。您可以在yaml文件中提供一个初始化脚本(下面是conf/gremlin-server-classic.yaml的一个片段,它与Gremlin发行版一起打包)。

代码语言:javascript
复制
scriptEngines: {
  gremlin-groovy: {
    imports: [java.lang.Math],
    staticImports: [java.lang.Math.PI],
    scripts: [scripts/generate-classic.groovy]}}

请注意“脚本”键,它允许您提供要执行的脚本文件。这些脚本将允许您访问"g“(或您配置的任何图形)。对于这个例子,scripts/generate-classic.groovy只是有:

代码语言:javascript
复制
TinkerFactory.generateClassic(g)

通过这种方式,您可以在Graph上完成所有初始化工作,这些工作最终将在Gremlin启动时由Gremlin托管,然后可以使用bin/gremlin-server.sh以标准方式启动所有初始化工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28432304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档