Gremlin 关于可能不存在的属性值的数学

Gremlin 关于可能不存在的属性值的数学,gremlin,Gremlin,下面是一个查询(gremlin python;tinkerpop v3.3.3),它插入一个属性为“正”和“负”的节点,然后从另一个节点中减去一个节点并输出结果: g.withSack(0).addV('test').property('positive', 2).property('negative', 3) \ .sack(assign).by('positive') \ .sac

下面是一个查询(gremlin python;tinkerpop v3.3.3),它插入一个属性为“正”和“负”的节点,然后从另一个节点中减去一个节点并输出结果:

g.withSack(0).addV('test').property('positive', 2).property('negative', 3) \
                            .sack(assign).by('positive') \
                            .sack(minus).by('negative') \
                            .sack().next()
Out[13]: -1
尝试相同的查询时,如果缺少其中一个属性,则会产生错误:

g.withSack(0).addV('test').property('positive', 2) \
                            .sack(assign).by('positive') \
                            .sack(minus).by('negative') \
                            .sack().next()
Out[13]: ... GremlinServerError: 500: The property does not exist as the key has no associated value for the provided element: v[36]:negative
我可以通过合并四种可能的情况来解决这个问题:

g.withSack(0).addV('test').property('positive', 2) \
    .coalesce(has('positive').has('negative').sack(assign).by('positive').sack(minus).by('negative').sack(), \
                has('positive').values('positive'), \
                has('negative').sack(minus).by('negative').sack(), \
                sack() \
                ).next()

但这确实很难看——有更整洁的解决方案吗?理想情况下,可以在没有属性的情况下插入默认值。我也尝试过使用“数学”步骤,但它只是稍微整洁一点,并不能避免不存在属性的问题。要明确的是,在多个遍历者的情况下,我希望每个遍历者都有结果。

< P>我认为,如果你做了<代码> Math[A](代码)>或<代码> SAK()/<代码>来解决这个问题,你应该考虑在这些顶点上有“需要”属性的想法,在这些顶点上你打算进行这些计算。这会让事情变得容易得多。我确实觉得
math()
会更整洁,尽管你不是这么说的:

g.V().as('a').out('knows').as('b').
  math("a - b").
    by(coalesce(values('hasSomeValue'), constant(0))).
    by(coalesce(values('missingValue'), constant(0)))

这是非常简单的,不过也许你的例子是为了简单起见,你还有很多复杂的事情需要考虑。 我认为如果第一次遍历没有返回任何内容,Gremlin可以更改为允许在

by()
中使用第二个参数作为默认值,因此:

g.V().as('a').out('knows').as('b').
  math("a - b").
    by(values('hasSomeValue'), constant(0)).
    by(values('missingValue'), constant(0))

我想可以保存一些键入,但我不确定它是否像使用
coalesce()
一样清晰。我想我更喜欢显式使用
coalesce()

> P>我认为如果你做了<代码> MUTHER()/代码>或<代码> SAK()/<代码>来解决这个问题,你应该考虑一下在这些顶点上有“需要”属性的想法,在这些顶点上你打算进行这些计算。这会让事情变得容易得多。我确实觉得
math()
会更整洁,尽管你不是这么说的:

g.V().as('a').out('knows').as('b').
  math("a - b").
    by(coalesce(values('hasSomeValue'), constant(0))).
    by(coalesce(values('missingValue'), constant(0)))

这是非常简单的,不过也许你的例子是为了简单起见,你还有很多复杂的事情需要考虑。 我认为如果第一次遍历没有返回任何内容,Gremlin可以更改为允许在

by()
中使用第二个参数作为默认值,因此:

g.V().as('a').out('knows').as('b').
  math("a - b").
    by(values('hasSomeValue'), constant(0)).
    by(values('missingValue'), constant(0))
我想可以保存一些键入,但我不确定它是否像使用
coalesce()
一样清晰。我想我更喜欢显式使用
coalesce()