Как использовать многопоточность для создания ребер гремлина

Я работал над графом гремлина tinkerpop, и в последнее время я могу выполнять с ним много вещей, теперь меня поразила одна точка, когда я пытаюсь обработать многие тысячи вершин и ребер, это занимает около часа, чтобы Завершите процесс, как я могу применить операцию parallelStream () к следующей части:

for(String s : somelist){
  String[] ss = s.split(",");
  graphTraversal().addEdge(ss[0], ss[1]);
}

Этот "somelist" содержит информацию об исходных и целевых вершинах каждого ребра (~ размер 65 000).


person SpaceyBot    schedule 29.06.2018    source источник
comment
какую базу данных графов вы используете?   -  person stephen mallette    schedule 29.06.2018
comment
ТинкерГраф @stephenmallette   -  person SpaceyBot    schedule 29.06.2018


Ответы (1)


Технически TinkerGraph не является полностью потокобезопасным для записи. Вы можете столкнуться с некоторыми проблемами в зависимости от того, что вы загружаете и как вы это загружаете. Я не могу точно сказать, что это за проблемы и что вам может потребоваться сделать, чтобы их избежать, но мы определенно не тестировали TinkerGraph таким образом.

Тем не менее, 65 000 ребер в формате, который вы указываете в своем образце кода, не должны занимать час для загрузки в TinkerGraph даже в однопоточном режиме работы. Звучит немного чрезмерно. Я предполагаю, что ваш пример кода - это не то, что вы на самом деле выполняете, поскольку это недопустимый синтаксис Gremlin, поэтому трудно сказать, в чем может быть проблема.

person stephen mallette    schedule 29.06.2018
comment
Фактически, это просто вызов метода, в котором метод выполняет следующее: - gV (). Has (id, ss0) .out (Link) .has (id, ss1) .fold () .coalesce (.unfold ( ), _.addE (BelongsTo) .from ( .V (v4)). to (_ .V (v3))). iterate (); Можно ли сделать это быстрее? - person SpaceyBot; 29.06.2018
comment
Вы создали индекс по идентификатору для своих вершин? также ... я думаю, вы можете просто сделать from(v4).to(v3) - нет необходимости повторно искать эти вершины, что дешево, но вы создаете дополнительные шаги без существенной причины. - person stephen mallette; 29.06.2018
comment
нет, я не создавал индекс, я просто использую идентификатор по умолчанию, созданный самим гремлином, меня беспокоят только дубликаты, поэтому не особо заботился об индексе, также я не знаю, будет ли это ускорит мою программу? - person SpaceyBot; 29.06.2018
comment
has("id", ss0) - это не то, как вы смотрите по идентификатору по умолчанию, созданному TinkerGraph. в этом случае вы имеете в виду свойство с именем id. Если вы хотите, чтобы идентификатор был создан графом, вам нужно сделать g.V(ss0) или has(id, ss0). Однако если id - это свойство, которое вы назначили, вам следует создать для него индекс, иначе вы будете повторять все вершины для каждого поиска. - person stephen mallette; 29.06.2018
comment
Я понял сейчас, извините .. У меня есть внешний идентификатор, назначенный ему, как вы создаете индекс для этого, какие-либо предложения, пожалуйста? - person SpaceyBot; 29.06.2018
comment
мой случай очень прост, все, что я делаю, - это создаю вершину (перед добавлением ребер) с идентификатором из самого списка (вот так): - Vertex v1 = gV (). has (id, id) .fold () .coalesce (__. развернуть (), __. addV (). свойство (T.label, typeName) .property (id, id) .property (имя, имя)). next (); - person SpaceyBot; 29.06.2018
comment
TinkerGraph позволяет вам назначать идентификаторы, чтобы либо сделать свое свойство id идентификатором графика с property(T.id, yourId), а затем поиск с g.V(yourId) будет быстрым, ИЛИ, если вы должны использовать property("id",yourId), тогда создайте индекс graph.createIndex("id",Vertex.class). - person stephen mallette; 29.06.2018
comment
Я не понимаю, почему мы назначаем Vertex.class идентификатору? и когда мы это сделаем? - person SpaceyBot; 29.06.2018
comment
когда вы создаете свой график, создайте index. вы не назначаете Vertex.class идентификатору, вы говорите, что создаете индекс для вершин для имени свойства, называемого 'id' - отсюда и имя метода createIndex(). - person stephen mallette; 29.06.2018