使用Gremlin在Amazon Neptune中实现顶点模式分析与匹配查询
Gremlin查询实现方案
核心逻辑
遍历所有匹配指定顶点序列的路径,计算序列相邻顶点之间插入的顶点总数,按总数升序排序后取最小值对应的完整会话路径。
可直接使用的查询语句
// 定义待匹配的目标顶点序列,可自行替换为实际需求值 g.withSideEffect('targetSeq', [1,2,3]) // 从目标序列的第一个顶点启动遍历 .V(select('targetSeq').unfold().limit(1)) .repeat( // 沿会话流转的next边遍历,添加simplePath避免环路提升性能 out('next').simplePath().as('step') ) .until( // 匹配到目标序列的最后一个顶点 hasId(select('targetSeq').tail(local)) // 校验路径中完整包含整个目标序列 .and().path().map(unfold().id().is(within(select('targetSeq'))).count()).is(eq(select('targetSeq').count(local))) ) // 组装返回字段:插入顶点数、会话ID、匹配到的路径 .project('insertCount','sessionId','matchPath') // 插入顶点数计算逻辑:总路径长度 - 目标序列长度 .by(path().count(local).minus(select('targetSeq').count(local))) .by(outE('next').values('SESSION_ID').limit(1)) .by(path().unfold().id().fold()) // 按插入顶点数升序排序,取最小的那条 .order().by('insertCount', asc) .limit(1) // 可选:如需返回整个会话的完整路径(包含目标序列之前的节点),启用下面的choose步骤 /* .choose( select('sessionId'), V().outE('next').has('SESSION_ID', select('sessionId')).otherV().path().unfold().id().fold(), select('matchPath') ) */
适配调整说明
- 若顶点的业务标识存储在
A属性而非顶点ID中,将查询中所有hasId()替换为has('A', xxx),id()替换为values('A')即可 - 若边的标签不是
next,替换为实际使用的边标签 - 替换
targetSeq的数组值为你需要匹配的任意顶点序列即可
样例验证
针对你给出的示例数据,该查询会计算得到两个匹配路径的插入顶点数:
[1,2,5,6,3]的插入顶点数为2[11,12,1,2,3]的插入顶点数为0
最终会返回插入数更小的[11,12,1,2,3],完全符合预期输出。
内容的提问来源于stack exchange,提问作者Anish Giri
相关产品推荐
相关产品推荐

