Я хочу отфильтровать свой граф, чтобы он включал только вершины с числом ребер меньше порогового (например, 50), вот так:
g.V().filter(bothE().limit(50).count().is(lt(50)))
Это дает мне список вершин, которые я хочу сохранить.
Как я могу создать объект traversal
, который включает только эти вершины?
Фон
Мне нужно вычислить k-шаговую окрестность каждой отдельной вершины в графе, которая отфильтровывает вершины с большим количеством ребер (например, ‹50). Отфильтрованный граф имеет несколько миллионов ребер и вершин.
Первый способ сделать это, который пришел в голову, заключался в том, чтобы сначала отфильтровать граф, сохранить результат в виде нового подграфа, а затем перебрать каждую вершину, чтобы найти окрестности k-го шага. Для одной вершины v
код соседства с k = 5 скачками:
g.V(v).repeat(__.bothE().bothV()).times(5).dedup().toList()
Лучшим способом может быть итерация каждой вершины в исходном нефильтрованном графе и игнорирование ребер, прикрепленных к вершине с большим количеством ребер, но я не уверен, как это сделать.
Попытка 1:
filtered_edges = g.V().filter(bothE().limit(50).count().is_(lt(50))).outE().toList()
subgraph = g.E(filtered_edges).subgraph('subGraph').cap('subGraph').next()
К сожалению, при использовании gremlinpython
выдается ошибка (StreamClosedError: Stream is closed
). Выполнение других - возможно, менее затратных - запросов до и после появления этой ошибки не приводит к аналогичным ошибкам, поэтому соединение с оболочкой gremlin все еще существует. Код также работает в оболочке gremlin (заменяя is_
на is
).
Я предполагаю, что это связано с тем, что я отправляю так много данных между сервером gremlin и Python, но не уверен, почему это может быть проблемой.
Попытка 2:
Использование клиента gremlin. Я пробовал перезаписать другой объект обхода с именем l
. Однако операция перезаписи не выполняется (l = subgraph.traversal();
).
gremlin_client = client.Client('ws://{}:{}/gremlin'.format('localhost', 8192), 'g', message_serializer=serializer.GraphSONSerializersV3d0())
command = "filtered_edges = g.V().filter(bothE().limit(50).count().is(lt(50))).outE().toList(); subgraph = g.E(filtered_edges).subgraph('subGraph').cap('subGraph').next(); l = subgraph.traversal();"
gremlin_client.submit(command).all().result()