JanusGraph Края не удаляются после истечения TTL - PullRequest
0 голосов
/ 26 мая 2018

Это вопрос относительно TTL, установленного на ребрах в JanusGraph.Я настроил тест, в котором я создаю метку ребра edgeLabel с продолжительностью TTL - в моем случае 5 секунд.

Затем я создаю ребро с этой меткой и жду, пока истечет срок действия TTL.Однако, похоже, что вершина не была удалена из графа.Ниже приведен пример, который проливает некоторый свет на то, что я пытаюсь сделать.

Пример

Скажем, g - это объект обхода TinkerPop.У меня есть 2 вершины с полем свойства _id v1 и v2.После создания ребра edgeLabel между v1 и v2 и ожидания 10 секунд я вижу, что к вершинам по-прежнему прикреплено ребро:

g.V().has("_id", "v1").next().edges(Direction.BOTH, "edgeLabel").hasNext() == true

Дополнительно, проверкаподсчет числа ребер на графике до и после ожидания в течение 10 секунд приводит к одинаковому подсчету, используя следующее:

g.E().count().next().longValue()

Я подтвердил, что значение TTL установленоправильно с JanusGraphManagement:

final JanusGraphManagement mgmt = graph.openManagement(); mgmt.getTTL(mgmt.getEdgeLabel("edgeLabel")).getSeconds() == 5

Конфигурация / Настройка

Я запускаю JanusGraph с Cassandra в качестве внутреннего хранилища базы данных со свойством storage.backend = cql противлокальный экземпляр базы данных со всеми остальными свойствами по умолчанию.


Мой вопрос: почему не удаляется край?Есть ли что-то, что мне нужно сделать, чего мне не хватает, например, обновить состояние базы данных графа?

Насколько я знаю, TTL должен работать с Cassandra в качестве хранилища внутренней базы данных, и это должно бытьдостаточно, чтобы убедиться, что TTL установлен правильно для ребра с заданной меткой в ​​JanusGraphManagement.

1 Ответ

0 голосов
/ 09 июня 2018

Причина, по которой ребро оказалось не удаленным, на самом деле из-за процесса, используемого для проверки того, было ли ребро удалено.Чтобы было понятно, процесс пошел следующим образом:

  1. создать ребро e между вершинами v1 и v2
  2. получить v1 и пройти по его краям, чтобы убедиться, чтоe существует
  3. ждать, пока время TTL не пройдет
  4. получить v1 и пересечь его границы снова, чтобы проверить, что e истекло и прошло

Проблема заключается в том, что на шаге (2) была создана локальная транзакция, к которой мы получили доступ e.На шаге (4) мы теперь пересекаем ребра v1, и, поскольку мы работаем в той же транзакции, e все еще существует.

Решение состоит в том, чтобы гарантировать, что транзакция зафиксированаперед выполнением шага (4).

...