Найдите последний добавленный узел

Я добавляю в граф вершины с определенной меткой (в настоящее время использую gremlin-python вместо gremlinv3.3). Я вручную добавляю к этим узлам свойство «отметка времени». Я хочу иметь возможность найти последнюю добавленную вершину с этой меткой, чтобы затем получить оттуда определенное количество вершин в обратном направлении вниз по цепочке. Добавление набора ребер типа «следующий» от второй самой новой до самой новой вершины при каждом добавлении позволит мне выполнить поиск в обратном направлении, как только я найду самую новую вершину.
Я хочу иметь возможность найти последняя добавленная вершина за сублинейное время (в идеале время O (1)). Вот пара идей, как это сделать:

  • Я мог бы вручную поддерживать узел типа "самый новый", который указывает на самую новую вершину этого типа, а затем искать его.
  • Я мог бы создать двоичное дерево индексных вершин по этим вершинам по мере их добавления, так что поиск по дереву и обратно от любой из этих вершин доставлял меня к самому новому узлу за O (log (n)) времени.
  • Также может быть, что я мог бы использовать свойство timestamp для эффективного поиска, но мне не ясно, как это сделать.

Проблема в том, что я недостаточно знаю о том, как поиск по графу реализован изнутри, чтобы знать, какая из этих стратегий лучше. Кто-нибудь может помочь? Также вероятно, что то, что я создаю, будет повторно развернуто в экземпляре amazon-neptune, и, опять же, мне не ясно, изменит ли это лучшую стратегию.


person simbamford    schedule 22.08.2018    source источник


Ответы (1)


Я мог бы вручную поддерживать узел типа "самый новый", который указывает на самую новую вершину этого типа, а затем искать его.

Это самое простое и быстрое решение. Решения, основанные на других поисковых запросах, требуют какой-то структуры индекса, которая не позволит вам получить доступ к последней вершине в O(1).

person Daniel Kuppitz    schedule 23.08.2018
comment
Спасибо, но, в конце концов, я не уверен, что это правильное решение. Я узнал о шаге profile (), который позволяет мне проверить время выполнения. g.g.addV('test').next() for x in range(10000): g.g.addV('other').next() if x % 100 == 0: print(g.g.V().hasLabel('test').profile().next()['@value']['dur']) Этот тест показывает, что продолжительность запроса увеличивается по мере увеличения содержимого (количества вершин). Однако, если я знаю идентификатор искомой вершины, запрос выполняется за время O (1). Это говорит о том, что я должен сохранить идентификатор самого последнего узла вне графика (?) - person simbamford; 23.08.2018
comment
Это считается антипаттерном. Возможно, просто проиндексируйте тестовую вершину на фиктивном свойстве. - person Daniel Kuppitz; 23.08.2018
comment
Ах! Я не понимал, что можно создавать индексы - это меняет правила игры. Фактически, этот раздел документации предполагает, что я не могу, по крайней мере, с Tinkerpop3: tinkerpop.apache.org/docs/3.3.3/reference / # _ indices, но в этом разделе говорится, что я должен уметь: tinkerpop.apache.org/docs/3.3.3/reference/#security ... с gremlin-python, прикрепленным к Tinkerpop3, я похоже, не может получить доступ к методу createIndex или createKeyIndex - какие-либо предложения? - person simbamford; 24.08.2018
comment
Мне только что напомнили, что Нептун все индексирует автоматически. Следовательно, такой запрос, как g.V().has('test', 'foo', 'bar'), всегда должен работать хорошо. - person Daniel Kuppitz; 24.08.2018