Gremlin的相关属性

问题描述

在JanusGraph中考虑以下架构。

g.addV('node1').next()
g.addV('node2').next()
g.addV('node3').next()

g.V().hasLabel('node1').as('fromV').V().hasLabel('node2').as('toV').addE('rel').from('fromV').to('toV').property('property1',1).iterate()

g.V().hasLabel('node1').as('fromV').V().hasLabel('node3').as('toV').addE('rel1').from('fromV').to('toV').property('property2',2).iterate()

3个节点:node1,node2和node3 2关系:node1-> rel-> node2和node1-> rel1-> node3

我希望rel1关系的property2依赖于公式2 * property1的rel关系的property1。 例: 如果property1 = 4,则property2 = 2 * 4 = 8

当property1更新时,是否可以自动更新property2?如何更新? 如果无法自动执行,如何使用查询进行更新?

解决方法

由于TinkerPop或JanusGraph中没有允许您指定此类规则的内容,因此您必须作为应用程序的一部分自己构建该功能。某些事情可能会帮助您构建此类功能:

  • EventStrategy-您可以尝试监听边缘属性的突变事件,然后触发更改。
  • JanusGraph Transaction Log-也许您可以直接听JanusGraph的交易日志,然后触发您的更改。
  • Gremlin DSLs-也许您可以将逻辑构建到自定义DSL步骤中,以便在记下对property('property1',<value>)的调用时可以注入其他Gremlin步骤来更新其他edge属性。
  • 如果您不需要实时数据,则显然可以使用批处理作业来更新property2值。如果您有一个非常大的图,那么您将希望使用Spark之类的工具并行执行此类作业。