为何添加project后两个Gremlin查询返回结果不同?
为什么两个Gremlin查询结果不同?如何修复第二个查询?
我来帮你拆解一下这两个查询的差异,以及怎么修改第二个查询得到正确结果。
问题原因
第一个查询是直接的链式遍历:找到目标person后,依次关联到face、遍历相似face、过滤掉关联了person的相似face,最后合并所有结果去重计数。这个逻辑是线性的,所有符合条件的相似face都会被收集到同一个流里,最终计数准确。
而第二个查询在project的by子句里直接串联遍历步骤时,路径上下文的处理出现了问题:当你从person跳到多个face后,后续的bothE('is similar')遍历没有将每个face对应的相似face结果扁平化,导致过滤和去重的作用域被限制在了每个face的局部路径中,而不是全局所有相似face的集合里。这就导致最终计数只统计了部分符合条件的结果,出现了和第一个查询不一致的情况。
修复方案
你可以通过两种方式修改第二个查询,让它和第一个查询的逻辑对齐:
方案1:使用flatMap扁平化结果
flatMap可以将每个face对应的相似face结果合并到同一个流中,确保后续的去重和计数作用于全局集合:
g.V().hasLabel('person').has('person','personId', 'd6688539-7773-4126-93bf-bb8ef979e25a'). project('personId','name','count'). by('personId'). by('name'). by( bothE('is').otherV().hasLabel('face'). flatMap( bothE('is similar').where(not(inV().bothE('is'))).otherV() ). dedup(). count() )
方案2:使用match明确路径(可读性更强)
用match步骤清晰定义每一段路径,避免上下文歧义,逻辑和第一个查询完全一致:
g.V().hasLabel('person').has('person','personId', 'd6688539-7773-4126-93bf-bb8ef979e25a'). project('personId','name','count'). by('personId'). by('name'). by( match( __.as('p').bothE('is').otherV().hasLabel('face').as('f'), __.as('f').bothE('is similar').otherV().hasLabel('face').as('sf'), __.as('sf').not(bothE('is')) ). select('sf'). dedup(). count() )
这两种修改后的查询都会正确返回3,和第一个查询的结果一致。
内容的提问来源于stack exchange,提问作者slooker
相关产品推荐
相关产品推荐

