Как запросить, есть ли у вершины несколько ребер к другим вершинам с той же меткой

Я пытаюсь понять, какие вершины "фильтров" имеют несколько ребер к вершинам с одинаковой меткой. Например, в этом случае "filter:2" имеет 2 ребра, идущих к вершинам с такой же меткой "projectType". Это также верно для "filter:3", поскольку у него 3 ребра, выходящие на вершины "projectType".

Я попытался выполнить шаг "цикла", но всегда получаю сообщение об ошибке на консоли. Я использую AWS Neptune.

Вершины

filter:1, filter 
filter:2, filter
filter:3, filter
projectType:1, projectType
projectType:2, projectType
projectType:3, projectType
projectType:4, projectType
city:1, city
city:2, city
city:3, city

Края

filter:1-projectType:1, services, filter:1, projectType:1
filter:2-projectType:1, services, filter:2, projectType:1
filter:2-projectType:2, services, filter:2, projectType:2
filter:3-projectType:2, services, filter:3, projectType:2
filter:3-projectType:3, services, filter:3, projectType:3
filter:3-projectType:4, services, filter:3, projectType:4
filter:1-city:2, services, filter:1, city:2
filter:2-city:1, services, filter:2, city:1
filter:3-city:1, services, filter:3, city:1

Код консоли для создания вершин и ребер

g.addV('filter').property('id','filter:1').as('f1').addV('filter').property('id','filter:2').as('f2').addV('filter').property('id','filter:3').as('f3').addV('projectType').property('id','projectType:1').as('p1').addV('projectType').property('id','projectType:2').as('p2').addV('projectType').property('id','projectType:3').as('p3').addV('projectType').property('id','projectType:4').as('p4').addV('city').property('id','city:1').as('c1').addV('city').property('id','city:2').as('c2').addV('city').property('id','city:3').as('c3').addE('services').from('f1').to('p1').addE('services').from('f2').to('p1').addE('services').from('f2').to('p2').addE('services').from('f3').to('p2').addE('services').from('f3').to('p3').addE('services').from('f3').to('p4').addE('services').from('f1').to('c2').addE('services').from('f2').to('c1').addE('services').from('f3').to('c1')
g.V().hasLabel('filter').as('x').outE().inV().loop('x').{it.loops < 3}.path()

{"requestId":"d63968ad-6c63-41f8-bfff-b31b09077a92","code":"MalformedQueryException","detailMessage":"Ошибка синтаксического анализа запроса в строке 1, позиция символа 68, сообщение об ошибке: ошибка распознавания токена в: 'Это.'"}

1 ответ

Я не совсем понимаю, что вы хотите в результате, учитывая вашу попытку решить вашу проблему, но если я приму ваш вопрос за чистую монету, вы, похоже, захотите получить список вершин "фильтра", у которых есть несколько меток, которые будут: фильтр:2"и" фильтр:3". Если это так, то:

gremlin> g.V().hasLabel('filter').
......1>   filter(out().
......2>          groupCount().by(label).
......3>          unfold().
......4>          select(values).
......5>          is(gt(1))).
......6>   values('id')
==>filter:2
==>filter:3

В filter()step проходит по исходящим ребрам и подсчитывает все метки на смежных вершинах. Затем в строке 3 разворачивается результатMap этикеток и подсчетов и извлекает только подсчеты (т.е. select(values) извлекает значение пары ключ / значение в Map запись, которая является счетчиком), а затем фильтрует эти счетчики с помощью is(gt(1)) означает, что текущая вершина имеет по крайней мере одну ситуацию, когда есть смежные вершины с более чем одной меткой

Другие вопросы по тегам