graph - 如何在 TinkerPop 图中传播值

标签 graph titan gremlin tinkerpop

如何通过 TinkerPop 图表“传播”一个值?即给定一个顶点上的属性值,我想沿着一条边将该值“移动”到另一个顶点或一组顶点。

示例,给定这个由 3 个顶点和连接它们的 2 条边组成的简单图:

gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> a = g.addV('name','a','amount', 100).next()
==>v[0]
gremlin> b = g.addV('name','b','amount', 0).next()
==>v[3]
gremlin> c = g.addV('name','c','amount', 0).next()
==>v[6]
gremlin> a.addEdge('drain', b, 'factor', 0.5)
==>e[9][0-drain->3]
gremlin> b.addEdge('drain', c, 'factor', 0.1)
==>e[10][3-drain->6]
gremlin> 

我希望在此图表上运行某种操作,以便将 a 中的 amount 复制到 b 乘以 >因素连接它们的边缘。例如。 b['amount'] 将等于 50。然后进一步传播 c['amount'] 将等于 5。

理想情况下,我想知道一个可以一次性将值传播到链上的单个语句,但也想知道一个可以将其传播到第一个相邻顶点,然后在第二次调用时将其传播到的语句下一个顶点等。

这是可以简单地在 Gremlin 中完成的事情,还是我需要 TinkerPop 的其他部分?

最佳答案

我设法使用 Gremlin sacks 做到了这一点:

gremlin> g.withSack(a.value('amount')).
           V(a).repeat(outE('drain').sack(mult).by('factor').
                       inV().property('amount', sack())).
                until(__.outE('drain').count().is(0)).iterate()
gremlin> g.V().valueMap()
==>[amount:[100],name:[a]]
==>[amount:[50.0],name:[b]]
==>[amount:[5.00],name:[c]]

我将“sack value”初始化为等于顶点“a”中的“amount”,并开始遍历,迭代地遍历我们乘以(即mult)的“drain”边缘袋中的值由“漏极”边缘上的“因子”属性决定。然后,通过 property() 步骤将 sack 分配给下一个顶点。

请注意,您可以使用 repeat 上的适当循环语义来控制“耗尽”(即您想要在链中走多远)。现在它使用 until() “没有更多的传出边缘”。但您也可以仅终止一步,如下所示:

gremlin> g.withSack(a.value('amount')).
           V(a).repeat(outE('drain').sack(mult).by('factor').
                       inV().property('amount', sack())).
                times(1).iterate()
gremlin> g.V().valueMap()
==>[amount:[100],name:[a]]
==>[amount:[50.0],name:[b]]
==>[amount:[0],name:[c]]

关于graph - 如何在 TinkerPop 图中传播值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41051109/

相关文章:

r - 如何在 R barplot 斜体上制作列标签

graph - 为图/分子比较算法调整文本搜索

java - 将数据加载到远程 Gremlin 图中

c++ - 使用 boost 在图中查找子节点

indexing - Titan Elasticsearch 自动创建索引

gremlin - 索引键上的 Titan 查找速度非常慢?

performance - 基于索引的查询太慢

neo4j - 如何使用 neo4j 和 cypher 或 gremlin 创建简单的协作过滤器

python - 将 OGM 与 AWS Neptune 结合使用

algorithm - 我应该如何使用链表找到图中的最短路径