我有一个图表,其中有一些节点有数百万个入射边缘,在Cassandra DB上使用Titan 0.5.2。例如。这再现了这样的图表:
mgmt = g.getManagementSystem()
vidp = mgmt.makePropertyKey('vid').dataType(Integer.class).make()
mgmt.buildIndex('by_vid',Vertex.class).addKey(vidp).buildCompositeIndex()
mgmt.commit()
def v0 = g.addVertex([vid: 0, type: 'start'])
def random = new Random()
for(i in 1..10000000) {
def v = g.addVertex([vid: i, type: 'claim'])
v.addEdge('is-a', v0)
def n = random.nextInt(i)
def vr = g.V('vid', n).next()
v.addEdge('test', vr)
if (i%10000 == 0) { g.commit(); }
}
所以我们有10M顶点都链接到v0并且顶点之间有一些随机链接。此查询:g.V('vid', 0).in('is-a')[0]
- 工作正常,g.V('vid', 0).in('is-a')[100]
或g.V('vid', 0).in('is-a')[1000]
也是如此。但是,如果我尝试进一步遍历 - 即g.V('vid', 0).in('is-a').out('test')[0]
- 那么查找会被卡住,最终我会从Cassandra获得读取超时异常:
com.thinkaurelius.titan.core.TitanException: Could not execute operation due to backend exception
Caused by: com.thinkaurelius.titan.diskstorage.TemporaryBackendException: Could not successfully complete backend operation due to repeated temporary exceptions after Duration[4000 ms]
at com.thinkaurelius.titan.diskstorage.util.BackendOperation.executeDirect(BackendOperation.java:86)
at com.thinkaurelius.titan.diskstorage.util.BackendOperation.execute(BackendOperation.java:42)
Caused by: com.netflix.astyanax.connectionpool.exceptions.TimeoutException: TimeoutException: [host=127.0.0.1(127.0.0.1):9160, latency=10000(10001), attempts=1]org.apache.thrift.transport.TTransportException: java.net.SocketTimeoutException: Read timed out
at com.netflix.astyanax.thrift.ThriftConverter.ToConnectionPoolException(ThriftConverter.java:188)
at com.netflix.astyanax.thrift.ThriftSyncConnectionFactoryImpl$ThriftConnection.execute(ThriftSyncConnectionFactoryImpl.java:
我也在Cassandra进程上获得高负载并且它变得没有响应(即,尝试连接到它返回超时)。所以,我的问题是为什么不可能从这个节点进一步遍历,即使实际上有很多节点的步骤很好 - 我怎么能让它工作呢?
答案 0 :(得分:3)
看来你已经有效地模拟了一个超级节点。当你调用函数
时g.V('vid', 0).in('is-a')[0]
您只是请求一个对象,这是一个快速查找。同样地:
g.V('vid', 0).in('is-a')[100]
也只请求一个仍然很快的对象。进行查询时:
g.V('vid', 0).in('is-a').out('test')[0]
你刚刚发出请求"找到我从百万个顶点的输出边缘连接的所有顶点并返回第一个"。它将要做的第一步是遍历所有这些边缘,然后才能返回"第一步"您请求的顶点。试着这样做:
g.V('vid', 0).in('is-a')[0].out('test')[0]
这不会遍历所有一百万个顶点。