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

时间:2018-09-13 17:24:26

标签: gremlin

这是一个查询(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()

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

1 个答案:

答案 0 :(得分:1)

我认为,如果您执行UserOrders来解决此问题,则您可能应该考虑采用在要进行这些计算的这些顶点上具有“必需”属性的想法。那应该使事情变得容易得多。我确实觉得Order会更整洁,尽管您另有说明:

kubectl --namespace=kube-system delete deployment,service,role,rolebinding,sa,secret -l k8s-app=kubernetes-dashboard

这很简单,尽管也许您的示例只是为了简单起见,但是您要考虑的复杂性却更大。

如果第一次遍历没有返回任何内容,我想可以将Gremlin更改为允许math()中的第二个参数作为默认值,因此:

sack()

保存一些我想输入的内容,但是我不确定是否像使用math()一样清晰易读。我认为我更喜欢显式使用g.V().as('a').out('knows').as('b'). math("a - b"). by(coalesce(values('hasSomeValue'), constant(0))). by(coalesce(values('missingValue'), constant(0)))