1

Transaction 、 Address 、および ValueTx(Edge) の 3 つの主要なクラスを持つスキーマがあります。

時間の範囲内で接続されたコンポーネントを見つけようとしています。

今、私はこれに基づいてこのクエリを実行しています ( OrientDB: connected components OSQL query ):

SELECT distinct(traversedElement(0)) from ( TRAVERSE both('ValueTx') from (select * from Transaction where height >= 402041 and height <= 402044))

そして、これは各トラバーサルの「頭」を取り除き、それから別のDFSを実行して、検索したい接続されたコンポーネントのすべてのノードとエッジを取得できます。

上記のクエリを使用して、接続されたコンポーネント内のトランザクション数とそれらの値の合計を取得するにはどうすればよいですか? (tx の値はクラス Transaction のプロパティです)

私は次のようなことをしたい:

SELECT distinct(traversedElement(0)) as head, count(Transaction), sum(valueTot) from ( TRAVERSE both('ValueTx') from (select * from Transaction where height >= 402041 and height <= 402044)) group by head

しかし、もちろん機能していません。最後のヘッドとすべてのトランザクションの合計を含む 1 行のみを取得します。

前もって感謝します。

編集:

これは私が探しているものの例です:

接続されたトランザクション

そこにあるすべてのトランザクションは同じ高さの範囲内にあります: 私のクエリ (投稿の最初のもの) を使用して、複数のアドレスを介してリンクされているトランザクションの各グループの最初のノードを取り除きます。例:

#15:27
#15:28
#15:30
#15:34
#15:35
#15:36
#15:37
#15:41
#15:47
#15:53

私が取得しようとしているのは、それが属するグループのトランザクションの総数(トランザクションのみをアドレス指定するのではなく)とすべてのトランザクションの値の合計(クラストランザクション内の valueTot に格納されている) を含むすべての最初のノードのリストです。 .

Edit2:これは私がテストを行っているデータセットです:主な問題は、私が以前に試していた多くのデータとアプローチを持っていることです(すべてのリッドから別のSQLクエリを作成します)それは非常に遅いです.より速い方法。Edit3: これは更新されたサンプル db です:ダウンロード (注: 他のものよりも大きいことに注意してください)

select head, sum(valueTot) as valueTot, count(*) as numTx,sum(miner) as minerCount from (SELECT *,traversedElement(0) as head from ( TRAVERSE both('ValueTx') from (select * from Transaction where height >= 0 and height <= 110000 ) while ( @class = 'Address' or (@class = 'Transaction' and height >= 0 and height <= 110000 )) ) where @class = 'Transaction' ) group by head

私のシステムでのこのクエリは、結果セットを制限した場合でも約1分かかるため、インデックスを使用していないトランザクションを選択する内部クエリに問題があると思います...何か考えはありますか?

4

2 に答える 2

1

このクエリを使用できます

select @rid, $a[0].sum as sumValueTot ,$a[0].count as countTransaction from Transaction 
let $a = ( select sum(valueTot),count(*) from (TRAVERSE both('ValueTx') from $parent.$current) where @class="Transaction")
where height >= 402041 and height <= 402044

それが役に立てば幸い。

于 2016-03-15T09:54:44.770 に答える
0

これはあなたが探しているものですか?

select head, sum(valueTot), count(*) from (SELECT *,traversedElement(0) as head from ( TRAVERSE both('ValueTx') from (select * from Transaction where height >= 402041 and height <= 402044)) where @class = "Transaction") group by head
于 2016-03-17T09:54:44.447 に答える