AWS Neptune/OpenCypher против Гремлина
Я тестировал производительность запросов с помощью OpenCypher и Gremlin на AWS Neptune. В настоящее время OpenCypher не обеспечивает хорошей производительности на AWS Neptune. Но также запросы Gremlin занимают больше времени, чем на AuraDB. Ф. е., у нас есть
Member
и
Token
узлы и есть
HAS
отношения между ними. Нам нужно найти 20 лучших других участников, у которых есть те же токены, что и у конкретного участника. Вот примеры запросов.
Запрос шифра:
MATCH (member:Member { address: '${address}' })-[:HAS]->(token:Token)<-[:HAS]-(other_member:Member) RETURN PROPERTIES(other_member) as member, COUNT(token) AS number_of_tokens ORDER BY number_of_tokens DESC LIMIT 20
Гремлин запрос:
g.V().hasLabel('Member').has('address', eq('${address}')).outE('HAS').as('member_has').inV().as('token').hasLabel('Token').inE('HAS').as('other_member_has').outV().as('other_member').hasLabel('Member').where(__.select('member_has').where(neq('other_member_has'))).select('other_member', 'token').group().by(__.select('other_member').local(__.properties().group().by(__.key()).by(__.map(__.value())))).by(__.fold().project('member', 'number_of_tokens').by(__.unfold().select('other_member').choose(neq('cypher.null'), __.local(__.properties().group().by(__.key()).by(__.map(__.value()))))).by(__.unfold().select('token').count())).unfold().select(values).order().by(__.select('number_of_tokens'), desc).limit(20)
Я считаю, что запрос Gremlin можно оптимизировать для достижения той же производительности, что и запрос Cypher в AuraDB. Каковы способы оптимизации текущего запроса Gremlin?