Neptune中Gremlin查询无法获取类父节点关联测量数据的问题
咱们一步步来修正这个查询。你之前的尝试之所以报错,是因为hasId(within())需要的是实际的ID值集合,但你传入的是一个遍历器(select('c').union(...)返回的是遍历逻辑,不是具体的ID值),Neptune没法把遍历器当成ID来处理,所以才会抛出那个错误。
下面是调整后的查询,既能获取泵关联类的测量数据,也能拿到该类所有父节点、祖父节点关联的测量数据:
获取measurement类型数据
g.V('pump').as('e') // 收集泵关联的类,以及该类所有向上的hasChild祖先节点(包括自身) .out('hasClass').aggregate('classAncestors') .repeat(__.in('hasChild')).emit().aggregate('classAncestors') // 获取泵对应的部署 .select('e').out('hasDeployment').as('d') // 获取部署产生的所有测量数据 .out('produces').as('m') // 筛选出由classAncestors集合中任意节点关联的measurement .where(__.in('measurement').where(within('classAncestors'))) .select('d', 'm')
获取summaryMeasurement类型数据
只需要把上面查询中的in('measurement')替换为in('summaryMeasurement')即可:
g.V('pump').as('e') .out('hasClass').aggregate('classAncestors') .repeat(__.in('hasChild')).emit().aggregate('classAncestors') .select('e').out('hasDeployment').as('d') .out('produces').as('m') .where(__.in('summaryMeasurement').where(within('classAncestors'))) .select('d', 'm')
一次性获取两种类型并标记
如果想一次查询返回两种类型的测量数据,同时标记数据类型,可以用choose分支逻辑:
g.V('pump').as('e') .out('hasClass').aggregate('classAncestors') .repeat(__.in('hasChild')).emit().aggregate('classAncestors') .select('e').out('hasDeployment').as('d') .out('produces').as('m') .choose( // 判断是否为measurement类型 __.in('measurement').where(within('classAncestors')), __.project('d', 'm', 'type').by(select('d')).by(select('m')).by(constant('measurement')), // 否则判断是否为summaryMeasurement类型 __.choose( __.in('summaryMeasurement').where(within('classAncestors')), __.project('d', 'm', 'type').by(select('d')).by(select('m')).by(constant('summaryMeasurement')), // 都不符合则丢弃 __.drop() ) )
关键逻辑说明
aggregate('classAncestors'):把泵直接关联的类,以及该类通过hasChild边向上追溯的所有祖先节点(包括自身)都收集到classAncestors集合中,确保不会遗漏任何可能关联测量数据的节点。where(__.in('measurement').where(within('classAncestors'))):检查当前测量数据的measurement入边是否来自classAncestors集合中的任意节点,这样就覆盖了直接类和所有祖先类的关联测量。
内容的提问来源于stack exchange,提问作者mrchangamire
相关产品推荐
相关产品推荐

