У меня есть граф с несколькими узлами с миллионами инцидентных ребер, использующий Titan 0.5.2 поверх Cassandra DB. Например. это воспроизводит такой график:
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(); }
}
Итак, у нас есть 10 миллионов вершин, которые все связаны с 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, и он перестает отвечать на запросы (т. е. попытка подключения к нему возвращает тайм-аут). Итак, мой вопрос: почему невозможно пройти дальше от этого узла, хотя шаг, который на самом деле имеет много узлов, в порядке - и как я могу заставить его работать?