почему наличие 2 fold () cmds в запросе gremlin так тяжело в большом graphdb? - PullRequest
1 голос
/ 02 августа 2020

Я хочу иметь команду, которая добавит вершину, если она не существует в графе, и я использую эту команду для этого

g.V().hasLabel('record').has('myId', 2284588).fold().coalesce(unfold(), addV('record').property('myId', 2284588))

это добавит 1 вершину, и я хочу чтобы иметь возможность делать несколько дополнений в одном запросе, как я понял, это быстрее, чем выполнение нескольких запросов

, поэтому команда, которая будет сгенерирована, будет примерно такой

g.V().hasLabel('record').has('myId', 2284588).fold().coalesce(unfold(), addV('record').property('myId', 2284588)).V().has('myId', 2284581).fold().coalesce(unfold(), addV('record').property('myId', 2284581))

это хорошо работает в небольшом графе (около 10000 вершин), это занимает около 0,1 секунды, но когда граф имеет около 1 миллиона вершин, одиночное добавление занимает 0,1 секунды, а когда я выполняю несколько команд, это занимает 20 секунд

из того, что я пробовал, похоже, что команда fold () занимает так много времени, но почему-то только тогда, когда она появляется более одного раза

, поэтому мой главный вопрос - почему и делаю ли я что-то здесь не так ...

Я использую гремлин с nodeJS и имею нептун (aws) graphdb

1 Ответ

2 голосов
/ 04 августа 2020

Является ли myId уникальным идентификатором для каждой вершины? Если это так, вы можете использовать его как фактический идентификатор вершины, а не делать его свойством. После этого вы сможете:

g.V('2284588')
 .fold()
 .coalesce(
    unfold(), 
    addV('record').property(t.id, '2284588')
 )
 .V('2284581')
 .fold()
 .coalesce(
    unfold(), 
    addV('record').property(t.id, '2284581')
  )

Это должно улучшить производительность и оставаться достаточно постоянным независимо от размера набора данных. Обратите внимание, что, используя свои собственные идентификаторы, вы можете выполнять прямой поиск по идентификатору без необходимости фильтрации по метке или свойству.

...