【问题标题】:Gremlin: What if my query cannot start with V() or E()?Gremlin:如果我的查询不能以 V() 或 E() 开头怎么办?
【发布时间】:2020-08-23 20:14:19
【问题描述】:

在我的项目上执行的第一个查询在可能为空的数据库上运行,如果尚未创建一些顶点,则创建一些顶点,因此我的查询不能以 V()E() 开头,因为数据库可能为空,也不能从addE() 开始,因为首先我需要检查是否没有创建边缘,我使用inject() 找到了以下解决方案,但它看起来像一个黑客:

g.inject("").union(
    coalesce(V().has("question", "questionId", 0), addV("question").property("questionId", 0)),
    coalesce(V().has("question", "questionId", 1), addV("question").property("questionId", 1)),
    coalesce(V().has("question", "questionId", 2), addV("question").property("questionId", 2))
)

有没有办法以一种优雅的方式来写这个,而没有任何看起来很老套的东西?

【问题讨论】:

  • 也许我做 Gremlin 的时间太长了,但 g.inject(0) 对我来说并不像黑客。当我认为必须在遍历流中才能有一个流时,首先要注入一个对我来说有意义的一次性值。虽然我相信你在下面有一个使用V() 的答案,但在你不能的情况下,还有什么其他语法可能更好?
  • 我同意与答案中的解决方案相比,我的解决方案感觉不到黑客攻击。当您使用为完全不同的目的而制作的工具来解决问题时,我认为这是一种黑客行为。注入的目的是将数据添加到遍历中,而不是解决无法以其他方式启动的查询。我认为 gremlin 应该实现类似 g.startEmptyTraversal() 之类的东西,专门针对这种需求而设计,否则感觉就像是 hack。
  • 只是为了清楚inject(0) 并没有真正困扰我,bechbd 的答案也没有,但你不是第一个不喜欢inject(0) 的人,所以我认为值得讨论看看你有没有什么想法。我认为显式的startEmpty() 有点过多地破坏了预期的遍历语义。但是,我想知道union()coalesce() 之类的步骤是否可以作为开始步骤,然后g.coalesce(V().has('name','alice'), addV().property('name','alice')) 或类似的步骤是可能的。不知道这意味着什么,但我会做一个笔记来进一步思考。谢谢。

标签: gremlin tinkerpop tinkerpop3 gremlin-server gremlinjs


【解决方案1】:

这种情况可以通过fold()/unfold() 描述的here 模式使用upsert 模式来处理。这看起来像下面的代码:

g.V().
  has("question", "questionId", 0).
  fold().
  coalesce(unfold(), addV("question").property("questionId", 0)).
  V().
  has("question", "questionId", 1).
  fold().
  coalesce(unfold(), addV("question").property("questionId", 1)).
  V().
  has("question", "questionId", 2).
  fold().
  coalesce(unfold(), addV("question").property("questionId", 2))

【讨论】:

  • 可能别无选择,但这对我来说也像是一个黑客,因为你需要执行 fold() 和展开(),你正在添加额外的计算并使用为完全不同的目的而制作的东西因为如果你不添加这个你就不能写查询
  • IMO fold().coalesce(unfold(),...) 模式更像是“Gremlin-ic”(类似于 python 是“pythonic”),因为查询模式实际上是在执行图遍历以执行条件写入,更加命令式风格。其中inject(0) 或(如果支持)直接以coalesce() 开头将尝试以更具声明性的样式编写此查询。使用fold()/unfold() 也可能不会增加额外的计算。每个 TinkerPop 图形数据库都会以不同的方式解析、优化和执行这些查询。许多人会优化这种模式,因为它是众所周知的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
相关资源
最近更新 更多