Gremlin查询:通过谓语和对象定位Sentence1并获取其子节点及节点间边
问题
我的图用来拆分句子为主语、谓语、宾语结构:
- 顶层节点代表完整句子(比如
Sentence1) - 主语(如
Kevin)、宾语(如formula_1)都是独立节点,通过belongs_to边关联到对应的句子节点 - 谓语是连接主语和宾语的边(比如
loves是Kevin指向formula_1的边)
我需要实现:通过指定谓语(loves)和宾语(formula_1)找到对应的句子节点(Sentence1),然后获取该句子下的所有关联节点,同时只保留这些节点之间的内部边,过滤掉其他无关的出入边。目前我能找到目标句子和关联节点,但拿不到节点之间的谓语边。
我尝试的Gremlin代码:
g.V() .hasId('formula_1').as('inVertex') .inE().hasLabel('loves') .outV().as('outVertex') .out('belongs_to') .where(in('belongs_to').hasId('formula_1')).as('sentence') .in('belongs_to').dedup().as('object') .bothE().as('predicate') .bothV().as('vertex') .where('vertex', eq('object')).dedup()
解决方案
可以分两步实现,逻辑更清晰,适合新手理解:
- 先精准定位到目标句子节点
- 提取该句子下的所有节点,以及这些节点之间的内部边
完整实现代码
// 第一步:定位目标句子节点 g.V().hasId('formula_1') .inE('loves') // 找到指向formula_1的loves谓语边 .outV() // 获取这条边的起点(主语Kevin) .out('belongs_to') // 找到主语所属的句子节点 .where(__.in('belongs_to').hasId('formula_1')) // 验证该句子确实关联formula_1 .as('sentence') // 第二步:提取句子内的所有节点和内部边 .in('belongs_to').dedup().as('sentenceNodes') .aggregate('nodes') // 把句子下的所有节点存入临时集合 .bothE() // 获取这些节点的所有关联边 .where(bothV().where(within('nodes'))) // 只保留两端都在句子节点集合里的边 .dedup() .project('sentence', 'nodes', 'edges') // 整理成易读的结构化输出 .by(select('sentence')) .by(select('nodes')) .by(valueMap())
代码说明
- 第一步通过宾语
formula_1反向找谓语loves的起点(主语),再通过主语的belongs_to边定位句子,双重验证确保句子同时关联主语和宾语 aggregate('nodes')把句子下的所有节点收集起来,后续过滤边时,只保留两端节点都在这个集合里的边,这样就精准拿到了句子内部的谓语边- 最后用
project把结果整理成包含句子、节点、边的清晰结构,方便查看
如果不需要结构化输出,也可以简化成更简洁的版本:
g.V().hasId('formula_1') .inE('loves').outV().out('belongs_to') .where(in('belongs_to').hasId('formula_1')) .in('belongs_to').aggregate('nodes') .bothE().where(bothV().within('nodes')).dedup() .path() // 输出边及其关联节点的完整路径
内容的提问来源于stack exchange,提问作者ESCL
相关产品推荐
相关产品推荐

