这是一个查询(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()
虽然确实很难看-有更整洁的解决方案吗?理想情况下,可以在没有属性的情况下插入默认值。我也尝试过使用“数学”步骤,但是它只是稍微整洁,不能避免不存在属性的问题。要明确的是,对于多个遍历器,我希望每个遍历器都有一个结果。
答案 0 :(得分:1)
我认为,如果您执行User
或Orders
来解决此问题,则您可能应该考虑采用在要进行这些计算的这些顶点上具有“必需”属性的想法。那应该使事情变得容易得多。我确实觉得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)))
。