Как запросить, если у вершины есть несколько ребер к другим вершинам с такой же меткой - PullRequest
1 голос
/ 30 сентября 2019

Я пытаюсь выяснить, какие «фильтрующие» вершины имеют несколько ребер к вершинам с одинаковой меткой. Например, в этом случае «filter: 2» имеет 2 ребра, идущих к вершинам с одинаковой меткой «projectType». Это также верно для «фильтра: 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, сообщение об ошибке:ошибка распознавания токена в: 'it.' "}

1 Ответ

0 голосов
/ 04 октября 2019

Мне неясно, что вы хотите получить в результате, учитывая вашу попытку решить вашу проблему, но если я возьму ваш вопрос за чистую монету, вы, похоже, захотите получить список «фильтрующих» вершин, которые имеют несколько меток, которыебудет "фильтр: 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() проходит по исходящим ребрам и учитывает все метки в смежных вершинах. Затем в строке 3 он раскрывает полученное Map меток, подсчитывает и извлекает только значения (т. Е. select(values) извлекает значение пары ключ / значение в записи Map, которая является значением счетчика), а затем фильтрует эти значения. is(gt(1)) означает, что у текущей вершины есть хотя бы одна ситуация, когда есть смежные вершины с более чем одной меткой

...