2016-09-13 1 views
1

私は今TitanDB + Cassandraをテストしています。このような グラフスキーマ:スピードアップする方法カッパドラでTitanDBの2ホップクエリ

VERTEX:USER(userId), IP(ip), SESSION_ID(sessionId), DEVICE(deviceId) EDGE:USER->IP, USER->SESSION_ID, USER->DEVICE データサイズ:頂点1億、エッジ:10億の インデックス:エッジのすべての種類の頂点中心のインデックス。 userId、ip、sessionId、およびdeviceIdのインデックス。

IP、DEVICE、およびSESSION_IDのための垂直パーティションを設定します。合計32パーティション。

カサンドラホスト:AWS EC2 I2(2xlage)x 24。 現在、すべてのホストは約30Gのデータを保持しています。

Usecase:userIdにedgeLabelを与え、このエッジのアウト頂点ですべての関連ユーザを見つけます。 例:g.V().has(T.label, 'USER').has('USER_ID', '12345').out('USER_IP').in().valueMap();

しかし、この種のクエリはかなり遅く、時には数百秒です。 1人のユーザが多くの関連するIP(数百人)を持つことができるので、これらのIPからは、たくさんのユーザ(数千人)も手に入れることができます。

バックエンドストレージのすべてのパーティションに対してこの種類のクエリをTitanに並列クエリしますか? 私は制限を使用してみてください:

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

また、遅いです。私はこの種の質問が5秒でできることを願っています。 タイタンの限界()の仕組みは?すべての結果を最初に取得し、次に「制限」しますか?

パフォーマンスを向上させるにはどうすればよいですか?誰も助言を与えることができますか?

答えて

1

タイタンのVertex Centric Indicesを使用することで、1つの頂点から別の頂点に素早く飛躍することができます。たとえば、次のようなものを試すことができます。

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を試してみてください。しかし、それはより複雑なプロセスです。

関連する問題