【发布时间】: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