gpt4 book ai didi

Gremlin 找到最高匹配

转载 作者:行者123 更新时间:2023-12-02 10:33:37 25 4
gpt4 key购买 nike

我计划使用图形数据库 (AWS Neptune),可以使用 Gremlin 作为一种知识库进行查询。知识库将用作具有多个特征的实体的分类工具。为简单起见,我在本示例中使用几何形状来编码实体的属性。假设我想对与正方形、三角形和圆形相关的点进行分类。我绘制了图表中点与可能的正方形、三角形和圆形的不同可能关系,如下图所示。

enter image description here

创建者:


g.addV('Square').property(id, 'S_A')
.addV('Square').property(id, 'S_B')
.addV('Circle').property(id, 'C_A')
.addV('Triangle').property(id, 'T_A')
.addV('Triangle').property(id, 'T_B')
.addV('Point').property(id, 'P1')
.addV('Point').property(id, 'P2')
.addV('Point').property(id, 'P3')

g.V('P1').addE('Has_Triangle').to(g.V('T_B'))
g.V('P2').addE('Has_Triangle').to(g.V('T_A'))
g.V('P1').addE('Has_Square').to(g.V('S_A'))
g.V('P2').addE('Has_Square').to(g.V('S_A'))
g.V('P2').addE('Has_Circle').to(g.V('C_A'))
g.V('P3').addE('Has_Circle').to(g.V('C_A'))
g.V('P3').addE('Has_Square').to(g.V('S_B'))


不同的实体例如点、正方形、三角形、圆形。

所以我的最终目标是找到满足最多条件的点。例如

g.V().hasLabel('Point').where(and(
out('Has_Triangle').hasId('T_A'),
out('Has_Circle').hasId('C_A'),
out('Has_Square').hasId('S_A')
))

// ==>v[P2]

上面的查询非常适合将具有属性 (T_A,S_A,C_A) 的点 (a) 分别分类为 Point 2 (P2) 类型。但是,如果我必须使用相同的查询来对具有属性 (C_A,S_B,T_X) 的点进行分类,例如:

g.V().hasLabel('Point').where(and(
out('Has_Triangle').hasId('T_X'),
out('Has_Circle').hasId('C_A'),
out('Has_Square').hasId('S_B')
))

查询无法将此点分类为点 3 (P3),因为知识库中没有 P3 的已知 Triangle 属性。

有没有一种方法可以表达一个查询,该查询返回具有最高匹配度的顶点(在本例中为 P3)?

提前谢谢您。

编辑

到目前为止,解决此问题的最佳方法是为不存在的 KB 属性设置哨兵值。然后修改查询以匹配每个确切的属性或标记值。但这意味着,如果我将来向 Point 添加新的属性“类型”,例如一个 Point Has_Hexagon,那么我需要将哨兵六边形添加到图表的所有点。

编辑2

添加了用于创建示例数据的 Gremlin 脚本

最佳答案

您可以使用 choose() 步骤为每次匹配增加计数器 (sack),然后按计数器值(降序)排序并选择第一个 (最高匹配)。

gremlin> g.withSack(0).V().hasLabel('Point').
choose(out('Has_Triangle').hasId('T_A'), sack(sum).by(constant(1))).
choose(out('Has_Circle').hasId('T_A'), sack(sum).by(constant(1))).
choose(out('Has_Square').hasId('T_A'), sack(sum).by(constant(1))).
order().
by(sack(), decr).
limit(1)
==>v[P2]

gremlin> g.withSack(0).V().hasLabel('Point').
choose(out('Has_Triangle').hasId('T_X'), sack(sum).by(constant(1))).
choose(out('Has_Circle').hasId('T_A'), sack(sum).by(constant(1))).
choose(out('Has_Square').hasId('S_B'), sack(sum).by(constant(1))).
order().
by(sack(), decr).
limit(1)
==>v[P3]

上述查询中的每个choose()步骤都可以读作if(条件)增量计数器。在任何情况下,无论是否满足条件,choose 步骤都会发出原始顶点 (Point)。

关于Gremlin 找到最高匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56922227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com