友人が他の友人を参照して購入することができるため、注文から注文まで「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によって発生する可能性があります。
ご協力いただければ幸いです。それとも、答えは、トラバースがこれを処理できないということです。
私はお手伝いしたいが、あなたのドメインは私には分かりません。 'out_includes'とは何ですか?関係や属性を説明する図を添付できますか? – Lvca
@Lvcaこんにちは、それは製品の頂点の外縁にすぎません(私たちのスキーマを単純化していますが、私たちが選択しているOrdersをフィルタリングするWHERE句もあります)。投稿を更新しました。ありがとう! –