Node.js查询图数据库使用where按用户隐私筛选返回空结果如何解决
问题排查与修复方案
核心问题原因
当前写法不生效的根本原因是:where 语句直接尝试选取顶层不存在的 privacy 字段。
你通过project('label','event', 'user')生成的遍历结果是三层结构的Map,privacy 是嵌套在user子对象里的属性,不能直接通过select('privacy')获取。
修复方案
提供两种可选写法,可根据业务需求选择:
方案1:提前过滤用户节点(推荐,性能更好)
把隐私过滤逻辑提前到查询用户节点的步骤,不符合要求的用户关联的Event会直接被过滤掉,不需要后续生成无效结构:
g.v() .has('label','Event') .not(has('active',false)).as('Event').order().by('createdTimestamp', decr) .project('label','event', 'user') .by(constant('Livestream')) .by( __.select('Event') .project('id', 'label', 'name', 'cover', 'description', 'allowComments', 'active', 'hashtags', 'partitionValue', 'userId', 'createdTimestamp', 'createdDate') .by('id').by('label').by('name').by('cover').by('description').by('allowComments') .by( coalesce( values('active'), constant(true) ) ) .by('hashtags') .by('partitionValue').by('userId').by('createdTimestamp').by('createdDate') ) .by( __.in('USERcreatedEVENT') // 提前过滤隐私属性 .has('privacy', 'PUBLIC') .project('id', 'privacy', 'label', 'email', 'username', 'name', 'displayPic') .by('id').by('privacy').by('label').by('email').by('username').by('name').by('displayPic') )
方案2:修改where语句取嵌套属性
如果你必须在project完成后再做过滤,仅修改最后一行where语句的取值路径即可:
// 原有查询逻辑不变,仅替换最后一行where语句 .where(select('user').select('privacy').is(eq('PUBLIC')))
其他可排查点
如果修改后还是返回空,可逐一验证以下项:
- 用户节点的
privacy字段值是否确实为全大写的PUBLIC,有没有大小写拼写、前后空格问题 - 确认
USERcreatedEVENT边的方向、标签拼写正确,Event节点确实通过该边关联到对应用户节点 - 确认存在至少一个
privacy为PUBLIC的用户关联了有效Event节点
内容的提问来源于stack exchange,提问作者Junaid Ahmad
相关产品推荐
相关产品推荐

