2016-05-16 3 views
0

友人が他の友人を参照して購入することができるため、注文から注文まで「causes_order」エッジを含む注文があります。オーダーID 42がオーダーID 47を引き起こしたので、2つのオーダー頂点の間に "起因する"エッジを作成します。OrientDBトラバース合計とグループの一番上のレコードで

私たちは、最も紹介されるビジネスを生み出している人々を特定しようとしています。現在、C#でループしており、データセットが比較的小さいため、これを把握しています。しかし、これを達成するためにTraverse SQLを使用する方法があるかどうかを確認したいと思います。

私が実行している問題は、各元の注文IDの正確なカウント/合計を取得していることです。

は、次のシナリオを検討

オーダー42がオーダー47オーダー47を含む4つの他の順序は、2つの追加注文を引き起こし引き起こさ。そして、注文51は、42または47に関係なく、3つの注文を引き起こした。

私は、この特定の{のProductId}のための最高の参照元を取得するには、以下のSQLを実行することができます:

select in_caused_order[0].id as OrderID, count(*) as ReferCount, sum(amount) as ReferSum 
from (traverse out('caused_order') from Order) 
where out_includes.id = '{ProductId}' and $depth >= 1 
group by in_caused_order[0].id 

EDIT:スキーマが少し複雑これよりも、私はちょうどout_includes含めたがOrdersのフィルタリングが少しあることを示します。しかし、それは少しのようだ:

Product(V) <-- includes(E) <-- Order(V) --> caused_order(E) --> Order(V) 
(the Order vertex has "amount" as a property, which stores the money spent and is being SUM'd in the SELECT, along with a few fields like date which aren't important) 

しかし、それは次のようになります:それはそれは、かなり右ではありません除き

OrderID | ReferCount | ReferSum 
42  | 4   | 525 
47  | 2   | 130 
51  | 3   | 250 

?注文42も技術的に47の2つの注文を引き起こしたからです。私は2つの「拡張」カウント/合計列は難しいかもしれないことを認識

OrderID | ReferCount | ReferSum | ExtendedCount | ExtendedSum 
42  | 4   | 525  | 2    | 130 
47  | 2   | 130  | 0    | 0 
51  | 3   | 250  | 0    | 0 

:だから私たちは、何かのように見てみたいと思います。クエリを2回、1回は$ depth = 1、もう一度は$ depth> 1で実行してから、これらの2つのクエリの結果をC#でアセンブルしなければならない場合があります。

しかし、全体の合計を正しく計算する方法を把握することさえできません。最初のステップは、さえのようなものを参照するために、次のようになります。

OrderID | ReferCount | ReferSum 
42  | 6   | 635  <-- includes its 4 orders + 47's 2 orders 
47  | 2   | 130 
51  | 3   | 250 

を、これは深いn-レベルすることができるので、私が何とかちょうどSQLでin_caused_order.in_caused_order.in_caused_orderを行うことができます好きではないです、私は知りませんどのくらい深く行くだろう。注文83は注文47によって発生する可能性があり、注文105は注文83によって発生する可能性があります。

ご協力いただければ幸いです。それとも、答えは、トラバースがこれを処理できないということです。

+0

私はお手伝いしたいが、あなたのドメインは私には分かりません。 'out_includes'とは何ですか?関係や属性を説明する図を添付できますか? – Lvca

+0

@Lvcaこんにちは、それは製品の頂点の外縁にすぎません(私たちのスキーマを単純化していますが、私たちが選択しているOrdersをフィルタリングするWHERE句もあります)。投稿を更新しました。ありがとう! –

答えて

0

私は、あなたのユースケースをしようとして以下のよ、私のテストデータです:

create class caused_order extends e 
create class Order extends v 
create property Order.id integer 
create property Order.amount integer 

begin 
create vertex Order set id=1 ,amount=1 
create vertex Order set id=2 ,amount=5 
create vertex Order set id=3 ,amount=11 
create vertex Order set id=4 ,amount=23 
create vertex Order set id=5 ,amount=31 
create vertex Order set id=6 ,amount=49 
create vertex Order set id=7 ,amount=4 
create vertex Order set id=8 ,amount=74 
create vertex Order set id=9 ,amount=87 

create edge caused_order from (select from Order where id=1) to (select from Order where id=2) 
create edge caused_order from (select from Order where id=1) to (select from Order where id=3) 
create edge caused_order from (select from Order where id=2) to (select from Order where id=4) 
create edge caused_order from (select from Order where id=2) to (select from Order where id=5) 
create edge caused_order from (select from Order where id=6) to (select from Order where id=7) 
create edge caused_order from (select from Order where id=6) to (select from Order where id=8) 
commit retry 20 

enter image description here


その後、私は相対referSumとReferCountで受注を表示するには、これらの2つのクエリを書きました。

数の頭の順序を含む第1:

select id as OrderID, $a[0].Amount as ReferSum, $a[0].Count as ReferCount from Order 

let $a=(select sum(amount) as Amount, count(*) as Count from (traverse out('caused_order') from $parent.$current) group by Amount) 

enter image description here

秒1、ヘッドを除く:

select id as OrderID, $a[0].Amount as ReferSum, $a[0].Count as ReferCount from Order 

let $a=(select sum(amount) as Amount, count(*) as Count from (select from (traverse out('caused_order') from $parent.$current) where $depth>=1) group by Amount) 

enter image description here


EDIT 私は私のデータにこれを追加しました:

select id as OrderID, $a[0].Amount as ReferSum, $a[0].Count as ReferCount from Order 

let $a=(select sum(amount) as Amount, count(*) as Count from (traverse out('caused_order') from $parent.$current while out('includes').id contains 102) group by Amount) 

where out('includes').id contains 102 

enter image description here

select id as OrderID, $a[0].Amount as ReferSum, $a[0].Count as ReferCount from Order 

let $a=(select sum(amount) as Amount, count(*) as Count from (traverse out('caused_order') from $parent.$current while out('includes').id contains 102) where $depth >= 1 group by Amount) 

where out('includes').id contains 102 

create class includes extends E 
create class Product extends V 
create property Product.id Integer 

create vertex Product set id = 101 
create vertex Product set id = 102 
create vertex Product set id = 103 
create vertex Product set id = 104 

create edge includes from (select from Order where id=1) to (select from Product where id=101) 
create edge includes from (select from Order where id=2) to (select from Product where id=102) 
create edge includes from (select from Order where id=3) to (select from Product where id=103) 
create edge includes from (select from Order where id=4) to (select from Product where id=104) 
create edge includes from (select from Order where id=5) to (select from Product where id=101) 
create edge includes from (select from Order where id=6) to (select from Product where id=102) 
create edge includes from (select from Order where id=7) to (select from Product where id=103) 
create edge includes from (select from Order where id=8) to (select from Product where id=104) 
create edge includes from (select from Order where id=9) to (select from Product where id=101) 
create edge includes from (select from Order where id=1) to (select from Product where id=102) 
create edge includes from (select from Order where id=1) to (select from Product where id=103) 
create edge includes from (select from Order where id=2) to (select from Product where id=104) 

、これらは変更されたクエリです(トラバースでwhile out('includes').id contains {prodID_number}where out('includes').id contains {prodID_number}を追加しました

enter image description here

+0

ありがとうございます。テストデータは正しいと思っていますが、SQLの結果は正しいように見えますが、ローカルで実行すると、db内のすべてのOrderIDのリストが取得されるので、私たちのインスタンスに何が翻訳されていないのか分かりません。私は特定の製品( "out_includes [0] .id = '{ProductId}'")の注文に限定したいのですが、それはどこにあるのでしょうか? –

+0

私は私のansを編集します –

+0

これは、私はまだ、何も合計/カウントなしでOrderIDsを取得し、私はまだ私はLETの動作と$親を経由してSELECTに参加することを学んでいると思います。 LETの内部では、選択されたOrderIDの中で正しいOrderIDに関連付けられますか? –

関連する問題