我们在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 版作为客户端。
基本上我正在尝试使用提供的最大跳数找到标签和实体之间的总分。
示例请求场景:
实体实体: 最大跳数为 2
的实体哈希“key1”和“key2”之间的总分标签标签: 标签 ID“123454”和“435677”之间的总分,最大跳数为 1
标签实体: 标签 ID '123454' 和最大跳数为 0 的实体哈希 'key1' 之间的总分(直接)
我是 neptune/gremline 的新手,对如何执行此操作没有正确的想法。一直在参考 tinkerpop 文档,没有太大进展。
我为场景 3 完成的查询示例是:
List<Map<Object, Object>> = graphTraversalSource.V(tagId).outE().has("hash", entityHash).valueMap().toList());
然后通过迭代列表并求和得到分数。 它适用于直接,但不确定如何继续进行 1 跳或 2 跳。
此外,这仅适用于标记实体。还没有设法做标签标签或实体实体评分。
对这些查询建模的任何想法都会非常有帮助。 非常感谢!
以下步骤可用于根据提供的数据构建示例图。
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
有了这些构建块,您应该能够创建查询来回答每个场景。