5

グラフデータベース( Titan )でうまく機能するアプリケーションを開発していますが、多くのエッジを持つ頂点、つまりスーパーノードに問題があります。

上記のスーパーノードのリンクは、Titanの作成者からのブログ投稿を指しており、問題を解決する方法を説明しています。解決策は、エッジでフィルタリングすることによって頂点の数を減らすことのようです。

残念ながらgroupCount、エッジまたは頂点の属性が必要です。たとえば、私には100万人のユーザーがいて、各ユーザーは1つの国に属しています。どうすればgroupCount各国のユーザー数をすばやく計算できますか?

私がこれまでに試したことは、この手の込んだGroovyスクリプトで示すことができます。

g = TitanFactory.open('titan.properties')  // Cassandra
r = new Random(100)
people = 1e6

def newKey(g, name, type) {
    return g
        .makeType()
        .name(name)
        .simple()
        .functional()
        .indexed()
        .dataType(type)
        .makePropertyKey()
}

def newLabel(g, name, key) {
    return g
        .makeType()
        .name(name)
        .primaryKey(key)
        .makeEdgeLabel()
}

country = newKey(g, 'country', String.class)
newLabel(g, 'lives', country)

g.stopTransaction(SUCCESS)

root = g.addVertex()
countries = ['AU', 'US', 'CN', 'NZ', 'UK', 'PL', 'RU', 'NL', 'FR', 'SP', 'IT']

(1..people).each {
    country = countries[(r.nextFloat() * countries.size()).toInteger()]
    g.startTransaction()
    person = g.addVertex([name: 'John the #' + it])
    g.addEdge(g.getVertex(root.id), person, 'lives', [country: country])
    g.stopTransaction(SUCCESS)
}

t0 = new Date().time

m = [:]    
root = g.getVertex(root.id)
root.outE('lives').country.groupCount(m).iterate()

t1 = new Date().time

println "groupCount seconds: " + ((t1 - t0) / 1000)

基本的に1つのルートノード(Titanが「すべての」ノードルックアップを持たないため)person、プロパティを持つ多くのビアエッジにリンクされていcountryます。100万個の頂点でgroupCount()を実行すると、1分以上かかります。

Titanはおそらく各エッジを反復処理してカウントを収集していると思いますが、Titanやその他のグラフデータベースでこれをより高速に実行する方法はありますか?インデックス自体をカウントして、トラバースする必要がないようにすることはできますか?私のインデックスは正しいですか?

4

1 に答える 1

8

'country'を'lives'ラベルの主キーにすると、特定の国のすべての人をより迅速に取得できます。ただし、あなたの場合、グループカウントに関心があります。グループカウントでは、ルートノードを反復処理して国をバケット化するために、そのルートノードのすべてのエッジを取得する必要があります。

したがって、この分析クエリは、グラフ分析フレームワークFaunusにはるかに適しています。完全なデータベーススキャンによってグループカウントを実行し、スーパーノードの問題を回避するため、ルート頂点は必要ありません。Faunusはクエリ言語としてGremlinも使用しているため、クエリを少し変更するだけで済みます。

g.V.country.groupCount.cap...

HTH、マティアス

于 2012-11-19T22:30:11.130 に答える