我正在测试TitanDB + Cassandra。 图形模式如下:
VERTEX:USER(userId), IP(ip), SESSION_ID(sessionId), DEVICE(deviceId)
EDGE:USER->IP, USER->SESSION_ID, USER->DEVICE
数据大小:顶点100万,边缘:10亿
索引:各种边缘的以顶点为中心的索引。 userId,ip,sessionId和deviceId的索引。
为IP,DEVICE和SESSION_ID设置Vertext分区。共32个分区。
Cassandra主持人:AWS EC2 I2(2xlage)x 24。 目前,每个主机都拥有大约30G的数据。
Usecase:给userId一个edgeLabel,通过这个edge的out顶点找出所有相关的用户。
例如:g.V().has(T.label, 'USER').has('USER_ID', '12345').out('USER_IP').in().valueMap();
但是这种查询很慢,有时甚至数百秒。 一个用户可以拥有许多相关的IP(数百个),因此从这些IP中,它也可以获得大量的USER(数千个)。
Titan是否并行查询针对后端存储的所有分区的这种查询? 我尝试使用限制:
g.V().has(T.label, 'USER').has('USER_ID', '12345').out('USER_IP').limit(50).in().limit(100).valueMap()
它也很慢。我希望这种查询可以在5秒内完成。 Titan limit()的工作原理如何?首先获得所有结果,然后'限制'??
如何提高性能呢?任何人都可以提出一些建议吗?
答案 0 :(得分:1)
你可以获得的一个快速性能来自使用泰坦Vertex Centric Indices,这可以让你从一个顶点快速跳跃到另一个顶点。例如,您可以尝试这样的事情:
mgmt = graph.openManagement()
userId = mgmt.getPropertyKey('userId')
userIp = mgmt.getEdgeLabel('USER_IP')
mgmt.buildEdgeIndex(userIp, 'userIdByUserIP', Direction.BOTH, Order.decr, time)
mgmt.commit()
创建一个简单的以顶点为中心的索引。
如果要从多个用户顶点查找多个用户ips,则可以尝试使用Titan-Hadoop。但是,这是一个更复杂的过程。