Tinkerpop / Gremlin: выберите вершины вместе с количеством исходящих ребер - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь найти эффективный запрос gremlin, который возвращает обход с вершиной и количеством исходящих ребер.Или даже лучше вместо числа исходящих ребер - логическое значение, если исходящие ребра существуют или нет.

Справочная информация: я пытаюсь улучшить производительность программы, которая записывает некоторые свойства в вершины, а затем выполняет итерацию по исходящимкрая, чтобы удалить часть этого.Во многих случаях отсутствуют исходящие ребра, и итерация for (Iterator<Edge> iE = v.edges(Direction.OUT); iE.hasNext();) { ... } занимает значительную часть времени выполнения.Поэтому вместо преобразования идентификаторов в вершины (с помощью gts.V(ids) я хочу собрать информацию о существовании исходящих ребер, чтобы пропустить итерацию, если это возможно.

Моя первая попытка была:

gts.V(ids).as("v").choose(__.outE(), __.constant(true), __.constant(false)).as("e").select("v", "e");

Вторая идея была такой:

gts.V(ids).project("v", "e").by().by(__.outE().count());

Кажется, что оба работают, но есть лучшее решение, которое не требует базовой реализации графа для выборки илисчитать все ребра?

(В настоящее время мы используем реализацию sqlg для tinkerpop / gremlin с Postgresql, и оба запроса, похоже, извлекают все исходящие ребра из Postgresql. Это может быть в случае, когда некоторая оптимизация отсутствует. Но мой вопросне является специфичным для sqlg.)

1 Ответ

0 голосов
/ 13 декабря 2018

Если вам нужно только знать, существуют ли ребра или нет, тогда вы должны limit() получить модулятор by():

gremlin> g.V().project('v','e').by().by(outE().limit(1).count())
==>[v:v[1],e:1]
==>[v:v[2],e:0]
==>[v:v[3],e:0]
==>[v:v[4],e:1]
==>[v:v[5],e:0]
==>[v:v[6],e:1]

Таким образом, вы не учитываете все ребра,только первое, которого достаточно, чтобы ответить на ваш вопрос.Вы можете сделать true и false, если хотите, с незначительными изменениями:

gremlin> g.V().project('v','e').by().by(coalesce(outE().limit(1).constant(true),constant(false)))
==>[v:v[1],e:true]
==>[v:v[2],e:false]
==>[v:v[3],e:false]
==>[v:v[4],e:true]
==>[v:v[5],e:false]
==>[v:v[6],e:true]
...