2016-08-23 13 views
1

g.V().hasLabel('Person').count()私のデータベースに人の頂点の数があり、g.V().hasLabel('Person').range(10,15)は私に人の頂点の範囲を与えます。同じgremlinクエリでカウントと範囲を取り出す方法

しかし、これらの2つを1つのGremlinクエリに結合する方法はありますか?

これは私のクエリの単純化されたバージョンですが、実際のクエリは静かで複雑であり、カウントを見つけるためにそれらの数のトラバースを繰り返すと、効果がないようです!

答えて

0

私が気づいたのは、グレムリンを使ってグレムリンを使って私が望むことを達成できることでした。これがどれほどエレガントかわからない!

def lst = g.V().hasLabel('Person').toList(); def result = ["count":0, "data":[] ]; result.count=lst.size();result.data=lst[2..3];result

これも私の複雑な場合には偉大な働いています。

+1

をあなたはグレムリンの手順を使用して好む必要がありますすなわち、 'count()'と 'range()'のステップがあるので、クエリオプティマイザを起動することができます。 – jbmusso

+0

提案していただきありがとうございます。 – Phani

2

すべてのクエリでフルcount()を実行することはお勧めしません。むしろ総数を1回カウントし、アプリケーションにキャッシュします。言っ

、ここであなたはとにかくそれを行うことができます方法は次のとおりです。

g.V().hasLabel('Person').aggregate('x').cap('x'). 
    project('page3', 'total').by(range(local, 10, 15)).by(count(local)) 

UPDATE:あなたはこの試みることができる古いバージョンでは

g.V().hasLabel('Person').aggregate('x').cap('x').as('page3', 'total'). 
    select('page3', 'total').by(range(local, 10, 15)).by(count(local)) 
+0

Danielに答えてくれましたが、これを試してみました。メソッドのシグネチャはありません:org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.project()は引数型に適用できます: (java.lang.String、java.lang.String)values:[page3、total] 可能な解決策:reset()、collect()、toSet()、inspect()、sort()、inject(groovy.lang。閉鎖) スタックトレースを表示しますか? [yN] ' – Phani

+0

私はTinkerpop 3.1.1-incubatingとtitan11ブランチを使用しています – Phani

+0

私はアプリケーションでカウントをキャッシュするつもりはありません。データはトランザクションであり、カウントは最初の応答!だから私は毎回フルカウントをしなければならないだろう。さらに、これはサンプルクエリであり、フルカウントでトラバースする頂点/エッジの実際の数は、適用されるフィルタのために少なくなります。 – Phani

関連する問題