Как запросить, есть ли у вершины несколько ребер к другим вершинам с той же меткой
Я пытаюсь понять, какие вершины "фильтров" имеют несколько ребер к вершинам с одинаковой меткой. Например, в этом случае "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))
означает, что текущая вершина имеет по крайней мере одну ситуацию, когда есть смежные вершины с более чем одной меткой