У меня проблема со скоростью выполнения запросов Титана.
Чтобы быть более конкретным: я создал файл свойств для своего графика с помощью BerkeleyJe, который выглядит следующим образом:
storage.backend=berkeleyje
storage.directory=/finalGraph_script/graph
После этого я открыл Gremlin.bat, чтобы открыть свой график.
Я настроил все необходимые ключи индекса для своих узлов:
m = g.getManagementSystem();
username = m.makePropertyKey('username').dataType(String.class).make()
m.buildIndex('byUsername',Vertex.class).addKey(username).unique().buildCompositeIndex()
m.commit()
g.commit()
(все остальные ключи создаются таким же образом...)
Я импортировал файл csv, содержащий около 100 000 строк, каждая строка создает как минимум 2 узла и несколько ребер. Все это делается через пакетную загрузку. Это работает без проблем.
Затем я выполняю запрос groupBy, который выглядит так:
m = g.V.has("imageLink").groupBy{it.imageLink}{it.in("is_on_image").out("is_species")}{it._().species.groupCount().cap.next()}.cap.next()
С помощью этого запроса я хочу, чтобы для каждого узла с ключом свойства «imageLink» было указано количество различных «видов». «Виды» также являются узлами, и их можно вызвать, вернувшись назад по ребру «is_on_image» и следуя по ребру «is_species». Ну, это также работает как шарм для моих последних узлов. Этот запрос занимает около 2 минут на моем локальном ПК.
Но теперь к проблеме. Весь мой набор данных представляет собой CSV с 10 миллионами записей. Структура такая же, как и выше, и каждая линия также создает как минимум 2 узла и несколько ребер.
С моего локального ПК я даже не могу импортировать этот набор, вызывая исключение памяти после 3 дней загрузки.
Поэтому я попробовал то же самое на сервере с гораздо большим объемом ОЗУ и памяти. Там Импорт работает и занимает около 1 дня. Но groupBy выходит из строя примерно через 3 дня. На самом деле я не знаю, выходит ли из строя сам groupBy или просто соединение с сервером после такого длительного времени.
Итак, мой первый вопрос: по моему мнению, около 15 миллионов узлов не должны иметь большого значения для графовой базы данных, не так ли?
Второй вопрос: Это нормально, что это занимает так много времени? Или можно как-то ускорить его с помощью индексов? Я настроил индексы, как указано выше :(
Я не знаю, какая именно информация вам нужна, чтобы помочь мне, но, пожалуйста, просто скажите мне, что вам нужно в дополнение к этому.
Большое спасибо! С уважением, Рикардо
РЕДАКТИРОВАТЬ 1: Способ загрузки CSV в график: я использую этот код, я удалил некоторые ненужные свойства, которые также устанавливают свойство для некоторых узлов, загруженных таким же образом.
bg = new BatchGraph(g, VertexIDType.STRING, 10000)
new File("annotation_nodes_wNothing.csv").eachLine({ final String line ->def (annotationId,species,username,imageLink) = line.split('\t')*.trim();def userVertex = bg.getVertex(username) ?: bg.addVertex(username);def imageVertex = bg.getVertex(imageLink) ?: bg.addVertex(imageLink);def speciesVertex = bg.getVertex(species) ?: bg.addVertex(species);def annotationVertex = bg.getVertex(annotationId) ?: bg.addVertex(annotationId);userVertex.setProperty("username",username);imageVertex.setProperty("imageLink", imageLink);speciesVertex.setProperty("species",species);annotationVertex.setProperty("annotationId", annotationId);def classifies = bg.addEdge(null, userVertex, annotationVertex, "classifies");def is_on_image = bg.addEdge(null, annotationVertex, imageVertex, "is_on_image");def is_species = bg.addEdge(null, annotationVertex, speciesVertex, "is_species");})
bg.commit()
g.commit()
groupBy
, вероятно, можно оптимизировать, но основная проблема заключается вg.V.has("imageLink")
— для этого требуется полное сканирование графа. Можете ли вы изменить эту часть, чтобы она использовала индекс? - person Daniel Kuppitz   schedule 05.03.2015BatchGraph
для загрузки данных, вы можете потерять здесь простую оптимизацию. github.com/tinkerpop/blueprints/wiki/Batch-Implementation - person stephen mallette   schedule 05.03.2015g.query().has('imageLink', EQUALS, 'abc').vertices()
, но мне просто нужны все узлы, у которых есть атрибут imageLink, несмотря на его значение. и это не работает сg.query().has('imageLink').vertices()
- person Ricardo Jacobsthal   schedule 05.03.20159 50c682d49177d00646000092 1 zebra ricardo http://imageLink
При этом создается один узел аннотации по идентификатору (50c...), один узел для вида (зебра), один для пользователя (рикардо) и один для изображения (imageLink) . Все эти узлы соединены ребрами, которые также создаются на том же этапе. Итак, каким образом предварительная сортировка имеет смысл в этом случае? Я знаю вики, на которую вы ссылаетесь, но не могу понять, что хорошо для моего варианта использования. ;-) - person Ricardo Jacobsthal   schedule 07.03.2015