簡體   English   中英

在gremlin中遵循相同類型的頂點(共享相同標簽的頂點)之間的特定關系(帶有特定標簽的邊)

[英]Follow a certain relationship (edge with a certain label) between the same kind of vertices (vertices that share the same label) in gremlin

我的任務是為可視化Neptune Graph數據庫的前端應用程序編寫查詢。 讓我們說第一個頂點是項,而第二個頂點用戶。 用戶可以創建一個項目。 存在項目與項目之間的關系,以顯示從另一個項目派生的項目,例如在從原始媒體剪輯切出的媒體剪輯的情況下。 創建的第一組項目應在諸如SERVER類的頂點中創建,並在用戶界面中對它們進行分組。

要求如下:

Filtering on a vertex shows the full graph for that vertex:
(1) Follow all ITEM - ITEM relationships
(2) Show any ITEM - USER relationships up to 1 hop (i.e. further ITEMs linked to a USER not shown already by (1) should not be displayed)

這是圖形的直觀表示。

https://drive.google.com/file/d/1YNzh4wbzcdC0JeloMgD2C0oS6MYvfI4q/view?usp=sharing

下面是重現此圖的示例代碼。 該圖甚至可能更深。 這只是一個簡單的例子。 請看下圖:

g.addV('SERVER').property(id, 'server1')
g.addV('SERVER').property(id, 'server2')
g.addV('ITEM').property(id, 'item1')
g.addV('ITEM').property(id, 'item2')
g.addV('ITEM').property(id, 'item3')
g.addV('ITEM').property(id, 'item4')
g.addV('USER').property(id, 'user1')


g.V('item1').addE('STORED IN').to(g.V('server1'))
g.V('item2').addE('STORED IN').to(g.V('server2'))
g.V('item2').addE('RELATED TO').to(g.V('item1'))
g.V('item3').addE('DERIVED FROM').to(g.V('item2') )
g.V('item3').addE('CREATED BY').to(g.V('user1'))

如果可能,結果應采用以下形式:

[
 [
   {
     "V1": {},
     "E": {},
     "V2": {}
   }
 ]
]

我們有一個帶有端點的API,該端點允許進行開放式gremlin查詢。 我們在客戶端應用程序中將此端點稱為獲取可視化呈現的數據。 我編寫了一個查詢,該查詢僅提供項目之間的一跳,但沒有遍歷整個圖形數據庫。

g.V('${id}').as('V1').bothE().dedup().as('E')
    .otherV().hasLabel(within('USER','ITEM')).as('V2').path().limit(500).select('V1', 'E', 'V2').fold()

如果可以的話,我能獲得一個查詢來獲取該數據集將不勝感激。 如果提供的頂點ID的頂點未連接任何東西,我想檢索它並將其單獨呈現在UI上。

如果我正確理解所有規則,則以下查詢應產生期望的結果:

g.V('${id}').aggregate('v1').
  repeat(__.as('V1').bothE().dedup().as('E').otherV().hasLabel('USER','ITEM').as('V2').
         aggregate('x').by(select('V1', 'E', 'V2'))).
    until(hasLabel('USER')).
  as('V1').bothE().dedup().as('E').otherV().hasLabel('ITEM').as('V2').
  aggregate('x').
    by(select('V1', 'E', 'V2')).
  cap('v1','x','v1').
  coalesce(select('x').unfold(),
           select('v1').unfold().project('V1'))

在您的樣本圖上執行將產生:

gremlin> g.V('server1').aggregate('v1').
......1>   repeat(__.as('V1').bothE().dedup().as('E').otherV().hasLabel('USER','ITEM').as('V2').
......2>          aggregate('x').by(select('V1', 'E', 'V2'))).
......3>     until(hasLabel('USER')).
......4>   as('V1').bothE().dedup().as('E').otherV().hasLabel('ITEM').as('V2').
......5>   aggregate('x').
......6>     by(select('V1', 'E', 'V2')).
......7>   cap('v1','x','v1').
......8>   coalesce(select('x').unfold(),
......9>            select('v1').unfold().project('V1'))
==>[V1:v[server1],E:e[0][item1-STORED IN->server1],V2:v[item1]]
==>[V1:v[item1],E:e[2][item2-RELATED TO->item1],V2:v[item2]]
==>[V1:v[item2],E:e[3][item3-DERIVED FROM->item2],V2:v[item3]]
==>[V1:v[item3],E:e[4][item3-CREATED BY->user1],V2:v[user1]]
==>[V1:v[user1],E:e[4][item3-CREATED BY->user1],V2:v[item3]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM