Не думаю, что ваш последний запрос поддержит оптимизацию. Разбираем ваш запрос:
new GremlinPipeline(graph.getVertices()).has("dmdid", id).has("type", type).cast(classOf[Vertex]).toList()
Вы загружаете все вершины графа в конвейер, который затем перебирает их в has
, где находится ваш индекс. Таким образом, остальная часть конвейера, начинающаяся с этого has
, рассматривает его как линейное сканирование. Гремлин не может правильно скомпилировать запрос, так как не знает всего.
То, что вы можете делать с индексами, очень сильно зависит от нижележащего графа. Реализация графа многое говорит о том, как будет происходить оптимизация. Касательно,
Во-первых, возможность оптимизировать запрос начальных вершин кажется невозможной, если мне нужно фильтровать по 2 индексированным ключам (здесь имя и фамилия)?
Получив «начальные вершины» с индексом ключа в смысле Blueprints, обобщенный подход будет заключаться в создании составного ключа, объединяющего имя и фамилию в одно свойство. Касательно,
Во-вторых, кажется, не работает возможность оптимизировать обход графа через конвейеры?
Вы не говорите, какую базу данных графов вы используете, но не все графы поддерживают передачу has
операций в базу данных. Titan наилучшим образом использует такие возможности и будет использовать преимущества вершинно-ориентированных индексов. везде, где они встречаются в выражении gremlin. Касательно:
Две первые концепции кажутся полностью разделенными, хотя, похоже, они сталкиваются с одной и той же проблемой. Для меня получение всех вершин и фильтрация по ним (последний пример) должны быть такими же, как и первые 2, потому что запрос выполняется в БД, вам так не кажется?
Как вы, вероятно, поняли из моего предыдущего утверждения, ваш запрос не выполняется в БД. Gremlin не компилируется в какое-то выражение, которое каждая база данных графов понимает и может оптимизировать. Gremlin - отличный код, работающий через Blueprints. Некоторые графические базы данных (например, Titan и OrientDB в некоторой степени) способны оптимизировать обходы на основе их реализации. Как я упоминал выше, Titan будет использовать индексы, ориентированные на вершины, где это возможно, чтобы ограничить, какие данные обрабатываются в памяти Gremlin. Такая оптимизация может привести к хорошему повышению производительности. .
person
stephen mallette
schedule
10.06.2014