首页 > 解决方案 > 在 Gremlin 中使用多个模式条件遍历图形

问题描述

我正在尝试进行 Gremlin 查询来遍历包含人和地点的图表。查询需要获取互相看的人的计数。假设它已经被图像算法收集和处理。请参阅下面的虚拟图。

g.addV('local').as('1').
  property(single, 'cidade', 'Londres').
  property(single, 'rua', 'Oxford').
  addV('pessoa').as('2').
  property(single, 'idade', 25).
  property(single, 'nome', 'Liam').
  property(single, 'genero', 'M').
  addV('pessoa').as('3').
  property(single, 'idade', 45).
  property(single, 'nome', 'Preston').
  property(single, 'genero', 'M').
  addV('pessoa').as('4').
  property(single, 'idade', 25).
  property(single, 'nome', 'Lexie').
  property(single, 'genero', 'F').
  addV('pessoa').as('5').
  property(single, 'idade', 45).
  property(single, 'nome', 'Toby').
  property(single, 'genero', 'M').
  addV('pessoa').as('6').
  property(single, 'idade', 52).
  property(single, 'nome', 'Sam').
  property(single, 'genero', 'M').
  addV('pessoa').as('7').
  property(single, 'idade', 32).
  property(single, 'nome', 'Jack').
  property(single, 'genero', 'M').
  addV('pessoa').as('8').
  property(single, 'idade', 29).
  property(single, 'nome', 'Lola').
  property(single, 'genero', 'F').
  addV('pessoa').as('9').
  property(single, 'idade', 51).
  property(single, 'nome', 'Bella').
  property(single, 'genero', 'F').
  addV('pessoa').as('10').
  property(single, 'idade', 37).
  property(single, 'nome', 'Dalilah').
  property(single, 'genero', 'F').
  addV('pessoa').as('11').
  property(single, 'idade', 28).
  property(single, 'nome', 'Oliver').
  property(single, 'genero', 'M').
  addV('pessoa').as('12').
  property(single, 'idade', 21).
  property(single, 'nome', 'Peter').
  property(single, 'genero', 'M').
  addV('pessoa').as('13').
  property(single, 'idade', 18).
  property(single, 'nome', 'Tyler').
  property(single, 'genero', 'M').addV('local').
    as('14').
  property(single, 'rua', 'Atlântica').
  property(single, 'cidade', 'Rio de Janeiro').
  addV('pessoa').as('15').
  property(single, 'nome', 'Marta').
  property(single, 'idade', 24).
  property(single, 'genero', 'F').
  addV('pessoa').as('16').
  property(single, 'nome', 'Jorge').
  property(single, 'idade', 18).
  property(single, 'genero', 'M').
  addE('olhou-para').from('2').to('4').
  addE('caminhando-em').from('2').to('1').
  property('data_hora', '4-7-21 8:31:23').
  addE('olhou-para').from('3').to('4').
  addE('caminhando-em').from('3').to('1').
  property('data_hora', '4-7-21 8:31:23').
  addE('caminhando-em').from('4').to('1').
  property('data_hora', '4-7-21 8:31:23').
  addE('olhou-para').from('5').to('4').
  addE('caminhando-em').from('5').to('1').
  property('data_hora', '4-7-21 8:31:23').
  addE('olhou-para').from('6').to('4').
  addE('caminhando-em').from('6').to('1').
  property('data_hora', '4-7-21 8:31:23').
  addE('olhou-para').from('7').to('9').
  addE('caminhando-em').from('7').to('1').
  property('data_hora', '4-7-21 8:31:23').
  addE('caminhando-em').from('8').to('1').
  property('data_hora', '4-7-21 8:31:23').
  addE('caminhando-em').from('9').to('1').
  property('data_hora', '4-7-21 8:31:23').
  addE('caminhando-em').from('10').to('1').
  property('data_hora', '4-7-21 8:31:23').
  addE('olhou-para').from('11').to('10').
  addE('caminhando-em').from('11').to('1').
  property('data_hora', '4-7-21 8:31:23').
  addE('olhou-para').from('12').to('8').
  addE('caminhando-em').from('12').to('1').
  property('data_hora', '4-7-21 8:31:23').
  addE('olhou-para').from('13').to('8').
  addE('caminhando-em').from('13').to('1').
  property('data_hora', '4-7-21 8:31:23').
  addE('caminhando-em').from('15').to('14').
  property('data_hora', '4-7-21 8:31:23').
  addE('caminhando-em').from('16').to('14').
  property('data_hora', '4-7-21 8:31:23').
  addE('olhou-para').from('16').to('15')

这个词是葡萄牙语,“caminhando-em”的意思是“走在路上”,意思是一个人走在特定的街道上。边缘“olhou-para”的意思是“盯着看”,意思是一个人在那个地方看着另一个人。目标是根据他人的长相来“衡量”一个人的美貌。我不知道“凝视”这个词在英语中是否适合表达这一点。

下面的查询用于获取按接收外观的人汇总的外观计数。

g.V().
inE("olhou-para").
group().by(inV().values("nome")).unfold().
project("pessoa","count").
by(select(keys)).
by(select(values).count(local)).
order().by("count",Order.desc)

结果是:

[
  {
    "pessoa": "Lexie",
    "count": 4
  },
  {
    "pessoa": "Lola",
    "count": 2
  },
  {
    "pessoa": "Marta",
    "count": 1
  },
  {
    "pessoa": "Dalilah",
    "count": 1
  },
  {
    "pessoa": "Bella",
    "count": 1
  }
]

问题是:如何在特定数据/时间仅选择伦敦的外观?我的意思是,如何过滤以忽略“里约热内卢”城市的“玛塔”顶点?

在此先感谢,胡里奥

标签: graphgremlin

解决方案


您也许可以添加一个额外的过滤器,如下所示:

gremlin> g.V().
......1> inE("olhou-para").
......2> filter(outV().out('caminhando-em').has('cidade','Londres')).
......3> group().by(inV().values("nome")).unfold().
......4> project("pessoa","count").
......5> by(select(keys)).
......6> by(select(values).count(local)).
......7> order().by("count",Order.desc)

==>[pessoa:Lexie,count:4]
==>[pessoa:Lola,count:2]
==>[pessoa:Dalilah,count:1]
==>[pessoa:Bella,count:1]  

推荐阅读