Graph 如何使用Cassandra加速TitanDB中的两跳查询

Graph 如何使用Cassandra加速TitanDB中的两跳查询,graph,cassandra,titan,gremlin,Graph,Cassandra,Titan,Gremlin,我现在正在测试TitanDB+Cassandra。 图形模式如下所示: 顶点:用户(userId)、IP(IP)、会话ID(sessionId)、设备(deviceId) 边缘:USER->IP,USER->SESSION\u ID,USER->DEVICE 数据大小:顶点1亿,边缘10亿 索引:各种边上的顶点中心索引。用户ID、ip、会话ID和设备ID的索引 为IP、设备和会话ID设置Vertext分区。共32个分区 卡桑德拉主机:AWS EC2 I2(2xlage)x 24。 目前,每台主机

我现在正在测试TitanDB+Cassandra。 图形模式如下所示:

顶点:
用户(userId)、IP(IP)、会话ID(sessionId)、设备(deviceId)
边缘:
USER->IP,USER->SESSION\u ID,USER->DEVICE
数据大小:顶点1亿,边缘10亿 索引:各种边上的顶点中心索引。用户ID、ip、会话ID和设备ID的索引

为IP、设备和会话ID设置Vertext分区。共32个分区

卡桑德拉主机:AWS EC2 I2(2xlage)x 24。 目前,每台主机都有大约30G的数据

用例:给出一个带有edgeLabel的用户ID,通过该边的out顶点找出所有相关用户。 例如:
g.V().has(T.label,'USER').has('USER_ID','12345').out('USER_IP').in().valueMap()

但这类查询非常慢,有时长达数百秒。 一个用户可以拥有许多相关的IP(数百个),因此从这些IP中,它也可以获得许多用户(数千个)

Titan是否针对后端存储的所有分区并行查询此类查询?? 我尝试使用限制:

g.V().has(T.label,'USER')。has('USER_ID','12345')。out('USER_IP')。limit(50)。in()。limit(100)。valueMap()

它也很慢。我希望这种查询能在5秒钟内完成。 Titan limit()是如何工作的?首先获得所有结果,然后是“限制”


如何提高it的性能?有人能给你一些建议吗?

你可以通过使用泰坦的快速性能提升,这可以让你从一个顶点快速跳到另一个顶点。例如,您可以尝试以下方法:

mgmt = graph.openManagement()
userId = mgmt.getPropertyKey('userId')
userIp = mgmt.getEdgeLabel('USER_IP')
mgmt.buildEdgeIndex(userIp, 'userIdByUserIP', Direction.BOTH, Order.decr, time)
mgmt.commit()
创建简单的以顶点为中心的索引

如果要从多个用户顶点查找多个用户IP,则可以尝试使用。然而,这是一个更复杂的过程