繁体   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