【发布时间】:2019-10-06 01:23:39
【问题描述】:
合并不能作为遍历的第一步,或者导致合并步骤的遍历没有产生至少一个结果。在你忽略这个问题之前,请听我说完。
如果我的图形数据库中有一个 label = 'foo' 和 id = 'bar' 的顶点,并且我想添加一个 label = 'baz' 和 id = 'caz' 的顶点,下面的 Gremlin 查询效果很好。
g.V('bar').coalesce(__.V('caz'), __.addV('baz').property('id', 'caz'))
如果;但是,我去掉了查询的第一部分,查询失败了。
g.coalesce(__.V('caz'), __.addV('baz').property('id', 'caz'))
同样,如果我按如下方式修改查询,它也会失败。
g.V('caz').coalesce(__.V('caz'), __.addV('baz').property('id', 'caz'))
要使合并工作,它必须具有一个包含一个或多个元素的输入集。我理解为什么当合并步骤中的步骤是 has 和 hasLabel 时,这种方法是有意义的;但是,它对 V 和 addV 没有意义。我猜想,coalesce 的服务器实现对 null 或空输入步骤有一个检查/返回,这会取消对该步骤的处理。
如果这是一般 Gremlin 的错误或改进请求,那么解决这个问题会很棒。如果只是 Cosmos DB 的问题,我将直接与 Microsoft 通话。
在此期间,我正在拼命寻找解决方案,以解决仅在元素不存在时才创建元素的挑战。我知道将折叠/展开与合并一起使用;但是,这会杀死我的遍历上下文,使之前定义的别名(使用 as('xyz'))无法使用。考虑到我们正在编写的查询的复杂性,我们不能失去上下文;在大规模处理数据时,我们也负担不起折叠计算。
非常感谢您对上述任何建议。
热烈的问候, 赛博
【问题讨论】:
标签: gremlin