【问题标题】:How to select optional graph structures with Gremlin?如何使用 Gremlin 选择可选的图形结构?
【发布时间】:2015-02-26 12:50:27
【问题描述】:

我正在使用 Gremlin 查询存储在 TitanDB 中的图形。

该图包含具有属性的用户顶点,例如“描述”,以及表示用户之间关系的边。

我想使用 Gremlin 来获取 1) 用户的属性和 2) 与其他用户的可能关系。例如,我可以使用以下查询来获取其描述中包含“开发者”一词的所有用户,以及来自这些用户或以这些用户为目标的带有“关系”标签的边:

g.V('description',CONTAINS,'developer').as('user').bothE.as('relationship').select

到目前为止,一切都很好。然而,问题是一些用户(还)没有任何关系。上面的查询将忽略这些用户(尽管他们的描述包含“开发者”),并且只会返回至少有一个关系的用户。

有没有办法选择描述中包含“开发者”的所有用户,如果存在的话,还可以选择他们的关系?

【问题讨论】:

  • 这里有一个后续问题:我如何在 TinkerPop 3 / Gremlin 3 中实现相同的效果?

标签: graph-databases gremlin titan


【解决方案1】:

你可以这样做:

g.V('description',CONTAINS,'developer').as('user').transform{it.bothE.toList()}.as('relationship').select

这样,你应该为那些没有边缘的开发者得到一个空列表。

在 TinkerPop 3.x 中,使用 TinkerPop 现代图,其中我丢弃了 id 为 12 的边,您可以:

gremlin> g.E(12).drop()
gremlin> g.V().hasLabel('person').as('u').
......1>       map(bothE().fold()).as('r').
......2>       select('u','r')
==>[u:v[1],r:[e[9][1-created->3],e[7][1-knows->2],e[8][1-knows->4]]]
==>[u:v[2],r:[e[7][1-knows->2]]]
==>[u:v[4],r:[e[10][4-created->5],e[11][4-created->3],e[8][1-knows->4]]]
==>[u:v[6],r:[]]

【讨论】:

  • 完美,这非常适合该场景。非常感谢!
  • 在 TP3 中你可以这样写(没试过):g.V('description',CONTAINS,'developer').as('user').optional(bothE().as('relationship')).select('relationship')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 2016-10-06
  • 2011-02-14
相关资源
最近更新 更多