簡體   English   中英

如何在 Gremlin 中的同一父節點下的節點內創建邊

[英]How to create edges within nodes under the same parent node in Gremlin

我是 Gremlin 的新手。 我想將同一“父”節點下的節點“子”與“兄弟”邊連接起來。

初始 state:

  • (:parent {name: 'A'})-[parent_of]->(:child {'name: 'A1'})
  • (:parent {name: 'A'})-[parent_of]->(:child {'name: 'A2'})
  • (:parent {name: 'B'})-[parent_of]->(:child {'name: 'B1'})
  • (:parent {name: 'B'})-[parent_of]->(:child {'name: 'B2'})

預期的:

  • 初始 state +
  • (:child {name: 'A1'})-[兄弟]->(:child {'name: 'A2'})
  • (:child {name: 'A2'})-[兄弟]->(:child {'name: 'A1'})
  • (:child {name: 'B1'})-[兄弟]->(:child {'name: 'B2'})
  • (:child {name: 'B2'})-[兄弟]->(:child {'name: 'B1'})

預期圖像:預期插圖

我應該如何為此編寫一個 gremlin 查詢?

所以給定這張圖

g.addV('Parent').property('name','A').as('a').
  addV('Parent').property('name','B').as('b').
  addV('Child').property('name','A1').as('a1').
  addV('Child').property('name','A2').as('a2').
  addV('Child').property('name','B1').as('b1').
  addV('Child').property('name','B2').as('b2').
  addE('parent-of').from('a').to('a1').
  addE('parent-of').from('a').to('a2').
  addE('parent-of').from('b').to('b1').
  addE('parent-of').from('b').to('b2').iterate()

我們可以通過幾種不同的方式添加兄弟關系。 這實際上僅取決於您要如何查找兄弟姐妹。 雖然我沒有在上面展示它,但在 Gremlin 中給每個頂點一個自定義 ID 並使用它來查找頂點是很常見的。 在此示例中,我將按名稱查找它們。

要找到每個父母的孩子,我們可以從一個簡單的查詢開始,例如:

g.V().hasLabel('Parent').out()

或者我們可以使用

g.V().hasLabel('Child')

鑒於我們已經找到了孩子,我們只需要擴展查詢以將孩子與共同的父母聯系起來。 實際上,可以通過多種方式編寫此查詢(稍后我將嘗試重新訪問此答案以顯示其他方式並討論可能的優化)。 這應該給你一些基本的構建塊。

gremlin>  g.V().hasLabel('Parent').as('p').
......1>        out().as('c').
......2>        addE('sibling').
......3>          to(V().hasLabel('Child').where(neq('c')).where(__.in('parent-of').as('p'))   
......4> )

==>e[40][24-sibling->26]
==>e[41][26-sibling->24]
==>e[42][28-sibling->30]
==>e[43][30-sibling->28]        

驗證它是否有效

gremlin> g.V().hasLabel('Child').out('sibling').path().by('name')

==>[A1,A2]
==>[A2,A1]
==>[B1,B2]
==>[B2,B1]  

在諸如大家譜之類的大圖中,這可能是一個昂貴的查詢,而針對特定的父母或孩子顯然是一個很好的優化。

編輯添加:

這是實現相同目標的另一種方法,但從每個孩子開始,然后遍歷到父母,然后再到兄弟姐妹,同時避免與自己聯系。

gremlin> g.V().hasLabel('Child').as('c').
......1>       addE('sibling').
......2>         to(__.in('parent-of').out('parent-of').where(neq('c')))
     
==>e[84][68-sibling->70]
==>e[85][70-sibling->68]
==>e[86][72-sibling->74]
==>e[87][74-sibling->72]    

暫無
暫無

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

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