2017-12-28 34 views
0

私は、特にnosqlデータベースとOrientDBを使い始めました。私の以前の経験は、SQL Serverを中心としたリレーショナルデータベースにあります。 MSSQLでOrientDb - グラフを使用して複数の頂点から選択

、私はこのような何か行うことができます。

SELECT s.url, p.title 
FROM Site s 
JOIN Page p ON s.Id = p.SiteId 

をそして、それは彼らが属するサイトのURLと一緒に、私のすべてのページの表を与える:

url   | title 
---------------------------- 
site1.com | page1 
site1.com | page2 
site2.com | page1 

を今、OrientDbでは、一方向の関係にはlink、双方向関係にはedgeを使用する必要があります。私はどのページがサイトに属しているのか、特定のページがどのサイトに属しているのかを知りたいので、この場合はエッジを使用することに決めました。サイトとページのクラス/頂点はすでに同様の方法で作成されていますが、同様の結果セットを取得する方法はわかりません。ドキュメント(https://orientdb.com/docs/2.2/SQL.html)から:

OrientDBは ターゲットとして多くのテーブルを可能SQL、とは対照的に、クラスを1つだけ(クラスは でこの議論のテーブルに相当します)ことができます。あなたは2つのクラスから選択したい場合は、あなたが 2サブクエリを実行し、彼らの例SELECT FROM E, V UNIONALL機能を

をそれらを結合する必要があり、その後SELECT EXPAND($c) LET $a = (SELECT FROM E), $b = (SELECT FROM V), $c = UNIONALL($a, $b)となり、それは私が欲しいものではありません。その結果、次のような結果になります

url   | title 
---------------------------- 
site1.com | 
site1.com | 
site2.com | 
      | page1 
      | page2 
      | page1 

MSSQLのように元の結果セットを作成するにはどうすればよいですか?

その他の考慮点:私の訓練とMSSQLの経験から、データベース操作はアプリケーションコードではなくデータベースで行う必要があることが示されています。たとえば、s.urlフィールドとs.idフィールドを取得した後、p.titleフィールドとp.SiteIdフィールドを取得するための2回目の呼び出しを行った後、アプリケーションコードでそれらを一致させることができます。私がこれを避ける理由は、複数のデータベース呼び出しが余分な/冗長な情報を返す時間よりも時間効率が悪いためです(私の例では、site1.comが2回返されます)。

OrientDbの場合や、一般的なグラフ/ nosqlデータベースの場合ではないでしょうか?代わりに、必要なすべてのデータを取得するために別々の呼び出しを2回行う必要があります。つまり、SELECT FROM Site WHERE Url = "site1.com"SELECT EXPAND(OUT("HasPages")) FROM Site WHERE Name = "site1.com"

答えて

2

ありがとう、これを試してみてください:

select Url, out("HasPages").title as title from Site unwind title 

はそれが

よろしくブリリアント

+0

を役に立てば幸い!ありがとうございました!私は、nosql/graphsのコンセプトの周りに頭を抱えていると思います。再度、感謝します! –

関連する問題