使用Joern的RunGremlinQuery查询结果长度与func_ids不符求助
问题原因与解决方法
原代码返回结果长度和func_ids不一致的核心原因有两个:
- 全局去重导致结果缩减:
dedup()会对所有节点的code进行全局去重,多个func_id对应同一code时,结果会被合并成一条。 - 缺失节点/无USE边的条目被过滤:如果某个
func_id对应的图节点不存在,或者该节点没有USE出边,这条func_id对应的结果会直接从返回值中消失。
要实现返回值长度与func_ids完全一致,需要保证每个func_id都对应一个结果条目(哪怕是空列表),同时保留每个节点自己的code集合(不做全局去重)。修改后的代码如下:
def getUSENodesVar(db, func_ids): # 使用参数绑定传递func_ids,避免字符串拼接的注入风险与格式问题 query = """ g.inject($func_ids).unfold().map( id -> g.V(id).out('USE').values('code').fold() ) """ # 需确认你的db.runGremlinQuery支持参数传递(多数Gremlin客户端都支持) return db.runGremlinQuery(query, parameters={"func_ids": func_ids})
代码说明:
inject($func_ids).unfold():将传入的func_ids列表拆分为单个id逐个处理,确保每个id都有对应的结果。map(id -> g.V(id).out('USE').values('code').fold()):对每个id,查询其对应的节点的USE出边的code值,并用fold()将结果收集为列表(无结果时返回空列表)。- 参数绑定:避免直接字符串拼接
func_ids,防止格式错误(比如id含特殊字符)与Gremlin注入风险。
如果你的数据库客户端不支持参数传递,也可以安全拼接id列表(仅当id为数字或安全字符串时),但优先推荐参数绑定方式:
def getUSENodesVar(db, func_ids): # 仅当func_ids元素为数字时安全使用,否则需做转义处理 func_ids_str = ','.join(map(str, func_ids)) query = f""" g.inject({func_ids_str}).unfold().map( id -> g.V(id).out('USE').values('code').fold() ) """ return db.runGremlinQuery(query)
内容的提问来源于stack exchange,提问作者zzkk
相关产品推荐
相关产品推荐

