2017-09-01 82 views
1

通過經鬆弛agheranimesh:根據用戶書籍列表的第二鄰居(作者)的屬性排序直接鄰居節點(書籍)?

這是我的圖,命名爲LibraryGraph

LibraryGraph

我的圖形查詢:

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

這不是給我結果,我想。我想要一個書籍清單按作者姓名排序和沒有作者的書應該最後(B2,B3,B1,B4,B5)。

腳本來重新創建數據(arangosh --javascript.execute <file>):

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

而是有可變深度(1..2)一個遍歷涵蓋這兩種情況下,書有和無的作者,我建議使用兩個遍歷:

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遍歷鏈接的書。然後,我們從每本書到相關作者進行第二遍遍歷。這可能會返回0,1或多個作者。子查詢將結果加到按字母順序排列的第一作者(例如X,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個頂點的路徑。 ..

[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 

在索引2(p.vertices[2])或回退值的作者被暫時存儲在一個變量name。然後,將書頂點分組在一起以消除重複(由可變的遍歷深度引起,其返回例如001-->B2,但也是較長的路徑001-->B2-->A)。

聚集用來挑的最低值(MIN),這通常意味着作者的名字按字母順序第一 - 它可能不適用於某些語言正確工作,但是字符集,而SORT不正確排序依據的設置語言的規則(每個DBMS實例只能有一個)。

分組結果 - 不同的書籍文檔 - 按作者姓名排序並返回。