[英]How to create edges within nodes under the same parent node in Gremlin
我是 Gremlin 的新手。 我想将同一“父”节点下的节点“子”与“兄弟”边连接起来。
初始 state:
预期的:
预期图像:预期插图
我应该如何为此编写一个 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.