Запросы Titan Graph выполняются слишком долго

У меня проблема со скоростью выполнения запросов Титана.

Чтобы быть более конкретным: я создал файл свойств для своего графика с помощью 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() 

person Ricardo Jacobsthal    schedule 04.03.2015    source источник
comment
Часть groupBy, вероятно, можно оптимизировать, но основная проблема заключается в g.V.has("imageLink") — для этого требуется полное сканирование графа. Можете ли вы изменить эту часть, чтобы она использовала индекс?   -  person Daniel Kuppitz    schedule 05.03.2015
comment
Просто наблюдение, но на самом деле загрузка 15 миллионов вершин не должна занимать 1 день. Вы мало говорите о том, как вы выполняете эту загрузку, но если вы не используете BatchGraph для загрузки данных, вы можете потерять здесь простую оптимизацию. github.com/tinkerpop/blueprints/wiki/Batch-Implementation   -  person stephen mallette    schedule 05.03.2015
comment
Спасибо Даниил за ваш ответ. Да, это тот самый момент, о котором я думал. Но как? Я не могу найти примеры, где вы ищете все узлы с одним и тем же свойством, используя индекс. Мне ясно, что я могу использовать индекс с g.query().has('imageLink', EQUALS, 'abc').vertices(), но мне просто нужны все узлы, у которых есть атрибут imageLink, несмотря на его значение. и это не работает с g.query().has('imageLink').vertices()   -  person Ricardo Jacobsthal    schedule 05.03.2015
comment
@stephenmallette я отредактировал свой вопрос и добавил внизу точный способ импорта CSV с помощью пакетного графика. Надеюсь это поможет! Я также думаю, что импорт узлов занимает слишком много времени.   -  person Ricardo Jacobsthal    schedule 05.03.2015
comment
Это довольно простой скрипт загрузки. Больший размер пакета с таким количеством -Xmx, которое вы можете сэкономить, должен помочь. Если вы понимаете, как распределяются ваши данные, их предварительная сортировка для максимального повторного использования кеша поможет ускорить процесс.   -  person stephen mallette    schedule 06.03.2015
comment
Что вы имеете в виду, когда говорите столько -Xmx, сколько сможете сэкономить? И я знаю, как распределяются мои данные. У меня есть все данные в коллекции mongoDB, и я преобразовываю их в csv. Каким образом сортировка? Прошу прощения за мои глупые вопросы, но на самом деле я совершенно не знаком с базами данных Graph...   -  person Ricardo Jacobsthal    schedule 06.03.2015
comment
Под -Xmx я имел в виду настройки памяти на вашей JVM. stackoverflow.com/q/14763079/1831717 и под предварительной сортировкой я имел в виду github.com/tinkerpop/blueprints/wiki/   -  person stephen mallette    schedule 07.03.2015
comment
А, хорошо, спасибо. Но из-за того, что это сервер из моего университета, у меня есть права на изменение настроек java/jvm. Одна строка моего csv выглядит так: 9 50c682d49177d00646000092 1 zebra ricardo http://imageLink При этом создается один узел аннотации по идентификатору (50c...), один узел для вида (зебра), один для пользователя (рикардо) и один для изображения (imageLink) . Все эти узлы соединены ребрами, которые также создаются на том же этапе. Итак, каким образом предварительная сортировка имеет смысл в этом случае? Я знаю вики, на которую вы ссылаетесь, но не могу понять, что хорошо для моего варианта использования. ;-)   -  person Ricardo Jacobsthal    schedule 07.03.2015
comment
@stephenmallette Я выяснил, что использование параметра конфигурации storage.batch-loading = true значительно ускоряет импорт. Но если эта опция включена, данные не сохраняются на сервере. Я задал еще один вопрос именно об этой проблеме здесь: com/questions/28911801/ Возможно, вы также знаете ответ на этот вопрос. Большое спасибо стивен!   -  person Ricardo Jacobsthal    schedule 07.03.2015