持久数据,并发访问和清除Titan DB

时间:2014-07-10 09:21:18

标签: java berkeley-db gremlin titan

我对Titan Graph蓝图和gremlin有不同的疑问。实际上,我尝试在Ubuntu上的java程序中实现Titan图,但我有不同的问题。我使用titanGraph v0.4.4。

第一次,你可以在Java程序中看到我的titan配置:

        BaseConfiguration config = new BaseConfiguration();
        Configuration storage = config.subset(GraphDatabaseConfiguration.STORAGE_NAMESPACE);

        // configuring local backend
        storage.setProperty(GraphDatabaseConfiguration.STORAGE_BACKEND_KEY, "local");
        storage.setProperty(GraphDatabaseConfiguration.STORAGE_DIRECTORY_KEY, "/tmp/testdbtitan");

        // configuring elastic search index
        Configuration index = storage.subset(GraphDatabaseConfiguration.INDEX_NAMESPACE).subset(INDEX_NAME);
        index.setProperty(INDEX_BACKEND_KEY, "elasticsearch");
        index.setProperty("local-mode", true);
        index.setProperty("client-only", false);
        index.setProperty(STORAGE_DIRECTORY_KEY, directory + File.separator + INDEX_NAME);

        TitanGraph graph = TitanFactory.open(config);
        graph.createKeyIndex("uuid", Vertex.class);

        return graph;

之后,我创建了一个顶点:

Vertex r = graph.addVertex(null);
r.setProperty("name", "akrogames");
graph.commit();

所以,我的Java程序中有一个顶点但是使用gremlin我看不到这个顶点:

gremlin> g = TitanFactory.open('/tmp/testdbtitan') 
gremlin> g.V.count()
==>0

我不明白为什么我有这个问题...

然后,我尝试使用我的java程序的不同实例访问我的数据库,但由于Titan中存在锁定,因此无法实现。这对我来说是一个问题,因为我想与不同的用户访问。请帮帮我......

最后,我无法清理我的泰坦数据库,因为我有一个例外:

TitanGraph graph = TitanFactory.open(config);
graph.shutdown();
TitanCleanup.clear(graph);

我有这个例外:

Exception in thread "main" com.thinkaurelius.titan.core.TitanException: Unexpected exception
 during backend operation
        at com.thinkaurelius.titan.diskstorage.util.BackendOperation.execute(BackendOperation.java:67)
        at com.thinkaurelius.titan.core.util.TitanCleanup.clear(TitanCleanup.java:32)
        at xxxx.xxxx.xxxxxx.xxxxx.xxxxxx.clearDB(XXXXXXX.java:365)
     Caused by: java.lang.NullPointerException
        at com.thinkaurelius.titan.util.system.IOUtils.deleteDirectory(IOUtils.java:24)
        at com.thinkaurelius.titan.util.system.IOUtils.deleteDirectory(IOUtils.java:26)
        at com.thinkaurelius.titan.util.system.IOUtils.deleteFromDirectory(IOUtils.java:17)
        at com.thinkaurelius.titan.diskstorage.berkeleyje.BerkeleyJEStoreManager.clearStorage(BerkeleyJEStoreManager.java:169)
        at com.thinkaurelius.titan.diskstorage.keycolumnvalue.keyvalue.OrderedKeyValueStoreManagerAdapter.clearStorage(OrderedKeyValueStoreManagerAdapter.java:59)
        at com.thinkaurelius.titan.diskstorage.Backend.clearStorage(Backend.java:465)
        at com.thinkaurelius.titan.core.util.TitanCleanup$1.call(TitanCleanup.java:35)
        at com.thinkaurelius.titan.core.util.TitanCleanup$1.call(TitanCleanup.java:32)
        at com.thinkaurelius.titan.diskstorage.util.BackendOperation.execute(BackendOperation.java:62)
        ... 5 more

我有这个例外但是我的DB被清理了......这很奇怪

谢谢你。

1 个答案:

答案 0 :(得分:0)

这看起来很可疑:

gremlin> g = TitanFactory.open('/tmp/testdbtitan') 
gremlin> g.V.count()
==>0

当我打开TitanGraph时,它看起来像这样:

gremlin> g = TitanFactory.open('/tmp/titan')
==>titangraph[local:/tmp/titan]

不确定您是否严重剪切和粘贴了Gremlin会话片段,但如果g没有打印任何内容,那么显然会出现问题。除此之外,为什么不通过构建Configuration对象(或使用属性文件)以与在Java中相同的方式在Gremlin控制台中打开图形?这似乎特别重要,因为您使用ElasticSearch作为您使用的简写方法并不能连接到它。

  

我尝试使用我的java程序的不同实例访问我的数据库   但这是不可能的,因为泰坦有锁。这是一个   我的问题是因为我想与不同的用户访问。

BerkeleyDB不是为此用例而设计的。它适用于单个JVM进程。您有两种选择:

  1. 使用Rexster,它将有效地让您共享对它的访问权
  2. 使用不同的后端,如Cassandra或Hbase

    我无法清理我的泰坦数据库,因为我有一个例外

  3. 此错误是否可重复?可以通过简单的Gremlin会话进行复制吗?如果是,请提供此类信息。正如你所看到的,对我来说似乎对我有用的基本场景听起来与你正在做的完全不同:

    gremlin> g = TitanFactory.open('/tmp/titan044')
    ==>titangraph[local:/tmp/titan044]
    gremlin> g.shutdown()
    ==>null
    gremlin> TitanCleanup.clear(g)
    ==>null
    gremlin> g = TitanFactory.open('/tmp/titan044')
    ==>titangraph[local:/tmp/titan044]
    gremlin> g.addVertex()
    ==>v[4]
    gremlin> g.commit()
    ==>null
    gremlin> g.shutdown()
    ==>null
    gremlin> g = TitanFactory.open('/tmp/titan044')
    ==>titangraph[local:/tmp/titan044]
    gremlin> g.V.count()
    WARN  com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx  - Query requires iterating over all vertices [()]. For better performance, use indexes
    ==>1
    gremlin> g.shutdown()
    ==>null
    gremlin> TitanCleanup.clear(g)
    ==>null