2017-09-01 2 views
1

:マイグラフクエリユーザブックリストの2次近傍(著者)の属性別に直接隣接ノード(書籍)をソートしますか?スラック経由agheranimeshことで

LibraryGraph

FOR v, e, p IN 1..2 OUTBOUND "User/001" GRAPH "LibraryGraph" 
    SORT p.vertices[2].Name 
    RETURN p.vertices[1] 

私が欲しい私は結果与えていない

これはLibraryGraphの名前、私のグラフです。 。私は書籍リストを著者名でソートし、著者のない本は最後に来るはずです(B2、B3、B1、B4、B5)。

スクリプトを再作成したデータに(arangosh --javascript.execute <file>):代わりに、両方のケースをカバーするために、可変深度(1..2)を持つ単一のトラバーサルの

db._createDatabase('Library') 
db._useDatabase('Library') 

const User = db._create('User') 
const Book = db._create('Book') 
const Author = db._create('Author') 

const User_Book = db._createEdgeCollection('User_Book') 
const Book_Author = db._createEdgeCollection('Book_Author') 

User.save({ '_key': '001', 'UserName': 'U1' }) 

Book.save({ '_key': 'B1', 'Name': 'B1' }) 
Book.save({ '_key': 'B2', 'Name': 'B2' }) 
Book.save({ '_key': 'B3', 'Name': 'B3' }) 
Book.save({ '_key': 'B4', 'Name': 'B4' }) 
Book.save({ '_key': 'B5', 'Name': 'B5' }) 

Author.save({ '_key': 'A', 'Name': 'A' }) 
Author.save({ '_key': 'B', 'Name': 'B' }) 
Author.save({ '_key': 'X', 'Name': 'X' }) 
Author.save({ '_key': 'Y', 'Name': 'Y' }) 
Author.save({ '_key': 'Z', 'Name': 'Z' }) 

User_Book.save({ '_from': 'User/001', '_to': 'Book/B1' }) 
User_Book.save({ '_from': 'User/001', '_to': 'Book/B2' }) 
User_Book.save({ '_from': 'User/001', '_to': 'Book/B3' }) 
User_Book.save({ '_from': 'User/001', '_to': 'Book/B4' }) 
User_Book.save({ '_from': 'User/001', '_to': 'Book/B5' }) 

Book_Author.save({ '_from': 'Book/B2', '_to': 'Author/A' }) 
Book_Author.save({ '_from': 'Book/B3', '_to': 'Author/B' }) 
Book_Author.save({ '_from': 'Book/B1', '_to': 'Author/X' }) 
Book_Author.save({ '_from': 'Book/B1', '_to': 'Author/Y' }) 
Book_Author.save({ '_from': 'Book/B1', '_to': 'Author/Z' }) 

const graph_module = require('org/arangodb/general-graph') 
const graph = graph_module._create('LibraryGraph') 

graph._addVertexCollection('User') 
graph._addVertexCollection('Book') 
graph._addVertexCollection('Author') 

graph._extendEdgeDefinitions(graph_module._relation('User_Book', ['User'], ['Book'])) 
graph._extendEdgeDefinitions(graph_module._relation('Book_Author', ['Book'], ['Author'])) 

答えて

1

、著者とない本、私がお勧め

FOR book IN OUTBOUND "User/001" GRAPH "LibraryGraph" 
    LET author = FIRST(
     FOR author IN OUTBOUND book._id GRAPH "LibraryGraph" 
      SORT author.Name 
      LIMIT 1 
      RETURN author.Name 
    ) OR "\uFFFF" 
    SORT author 
    RETURN book 

まず、User/001からリンク先の書籍に移動します。次に、各書籍からリンクされた著者まで、2回目のトラバーサルを行います。これは、0人、1人または複数の著者を返す可能性があります。サブクエリはアルファベット順の最初の著者(X、Y、ZのXなど)に結果を出力し、その名前を返します。

メインクエリの範囲では、著者名またはフォールバックをソートされた場合に最後に終わる値にします(nullが最初に終了しますが、これは望ましくありません)。その後、我々は著者名の書籍をソートし、それらを返す:

Query result

この結果を達成するための別の方法を、まだ理解することが難しい:

FOR v, e, p IN 1..2 OUTBOUND "User/001" GRAPH "LibraryGraph" 
    LET name = p.vertices[2].Name OR "\uFFFF" 
    COLLECT book = p.vertices[1] AGGREGATE author = MIN(name) 
    SORT author 
    RETURN book 

トラバーサルは2つのまたは3の頂点とパスを返します。 ..インデックス2(p.vertices[2])または代替値で

[0]   [1]   [2] 
User/001 --> Book/B2 
User/001 --> Book/B2 --> Author/A 
User/001 --> Book/B3 
User/001 --> Book/B3 --> Author/B 
User/001 --> Book/B4 
User/001 --> Book/B5 
User/001 --> Book/B1 
User/001 --> Book/B1 --> Author/Y 
User/001 --> Book/B1 --> Author/X 
User/001 --> Book/B1 --> Author/Z 

著者らが一時的変数に格納されています。次にブックの頂点をグループ化して重複を排除します(可変トラバースの深さによって発生します。たとえば、001-->B2が返されますが、より長いパス001-->B2-->Aが返されます)。

アグリゲーションは、最も低い値(MIN)の著者名を選ぶために使用されます。通常はアルファベット順であるため、一部の言語や文字セットで正しく機能しない可能性があります。SORTは、設定された言語のルール(DBMSインスタンスごとに1つしかない)。

グルーピング結果 - 個別のブックドキュメント - は著者名でソートされ、返されます。

関連する問題