Neptune gremlin java 用 hops 遍历

问题描述 投票:0回答:1

我们在neptune db中有一个标签和实体关系的模型如下:

顶点 - 标签。

id
---
123454
123478
345678
435677
....
....
id   | from   | to     | hash | score
---------------------------------------------
3455 | 123454 | 345678 | key1 | 2.4
3456 | 123454 | 123478 | key2 | 3.5
3457 | 345678 | 435677 | key2 | 3
3458 | 435677 | 435677 | key3 | 1

From 和 to 是 in 和 out 顶点(标签的 id)。 请注意,在边缘,'hash' 可以有重复值。

我们使用 Java 编程并使用 tinkerpop gremlin 3.5 版作为客户端。

基本上我正在尝试使用提供的最大跳数找到标签和实体之间的总分。

示例请求场景:

  1. 实体实体: 最大跳数为 2

    的实体哈希“key1”和“key2”之间的总分
  2. 标签标签: 标签 ID“123454”和“435677”之间的总分,最大跳数为 1

  3. 标签实体: 标签 ID '123454' 和最大跳数为 0 的实体哈希 'key1' 之间的总分(直接)

我是 neptune/gremline 的新手,对如何执行此操作没有正确的想法。一直在参考 tinkerpop 文档,没有太大进展。

我为场景 3 完成的查询示例是:

List<Map<Object, Object>> = graphTraversalSource.V(tagId).outE().has("hash", entityHash).valueMap().toList());

然后通过迭代列表并求和得到分数。 它适用于直接,但不确定如何继续进行 1 跳或 2 跳。

此外,这仅适用于标记实体。还没有设法做标签标签或实体实体评分。

对这些查询建模的任何想法都会非常有帮助。 非常感谢!

java gremlin tinkerpop amazon-neptune tinkerpop3
1个回答
0
投票

以下步骤可用于根据提供的数据构建示例图。

g.addV('tag').property(id,123454).as('t1').
  addV('tag').property(id,123478).as('t2').
  addV('tag').property(id,345678).as('t3').
  addV('tag').property(id,435677).as('t4').
  addE('link').from('t1').to('t3').property(id,3455).property('hash','key1').property('score',2.4).
  addE('link').from('t1').to('t2').property(id,3456).property('hash','key2').property('score',3.5).
  addE('link').from('t3').to('t4').property(id,3457).property('hash','key2').property('score',3).
  addE('link').from('t4').to('t4').property(id,3458).property('hash','key3').property('score',1)  

我们可以通过使用图形笔记本渲染它来确认图形看起来不错

下面的查询可用于向我们显示节点 123454 和 435677 之间的分数。

repeat
结合了
until
loops
以检查特定目标或达到给定深度。第二个
has
是必要的,以确保我们找到了我们想要的节点,而不仅仅是达到最大深度。

g.V(123454).
  repeat(outE().inV().simplePath()).
  until(hasId(435677).or().loops().is(2)).
  hasId(435677).
  path().
    by(id).
    by('score')

运行时,使用Gremlin Console,我们可以看到结果

gremlin> g.V(123454).
......1>   repeat(outE().inV().simplePath()).
......2>   until(hasId(435677).or().loops().is(2)).
......3>   hasId(435677).
......4>   path().
......5>     by(id).
......6>     by('score')

==>[123454,2.4,345678,3,435677]

剩下要做的就是扩展查询以计算总分。

sack
步骤对此很有用。

gremlin> g.withSack(0).
......1>   V(123454).
......2>   repeat(outE().sack(sum).by('score').inV().simplePath()).
......3>   until(hasId(435677).or().loops().is(2)).
......4>   hasId(435677).
......5>   sack()

==>5.4

有了这些构建块,您应该能够创建查询来回答每个场景。

© www.soinside.com 2019 - 2024. All rights reserved.