Оптимизировать запрос импорта neo4j cypher - PullRequest
0 голосов
/ 26 апреля 2018

Я создал приложение на C # с использованием Neo4j.Driver.V1, которое читает из CSV и записывает его в графическую базу данных neo4j.

Мой CSV имеет 1000 записей. Каждая запись разбита на 5 узлов с отношениями между ними.

Весь процесс занимает 1 минуту 11 секунд (включая 1 секунду на мою логику для построения запроса).

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

Вот мой запрос:

MERGE 
    (accountd71d278a8eeb468f9e4517ac1e007fe5:Account 
        { 
            number: '952'
        } )         
ON CREATE 
    SET accountd71d278a8eeb468f9e4517ac1e007fe5 += 
    { 
        number: '952', 
        balanceType: 2, 
        accountType: 2, 
        openDate: apoc.date.parse('7/9/2015', 'ms', 'm/d/YYYY')
    }

MERGE (account13aa03cd1b6d449e88a3e5e5a22353da:Account 
    { 
        number: '198'
    } ) 
ON CREATE 
    SET account13aa03cd1b6d449e88a3e5e5a22353da += 
    { 
        number: '198'
    } 

MERGE (transactionba1459c4f7854157be237e7365497fcf:Transaction 
    { 
        number: '1'
    } ) 

ON CREATE 
    SET transactionba1459c4f7854157be237e7365497fcf += 
    { 
        number: '1', 
        amount: 3717.81, 
        type: 2, 
        date: apoc.date.parse('2016-05-27', 'ms', 'YYYY-mm-dd')
    }  

MERGE (bank3679799504f54bed9f079848be9c6eff:Bank 
    { 
        code: 'MMBC'
    } ) 
ON CREATE 
    SET bank3679799504f54bed9f079848be9c6eff += 
    { 
        code: 'MMBC', 
        country: 'Mongolia'
    }  

MERGE (bank522b6b6ed04d40bd9d87d4ecc36fbde2:Bank 
    { 
        code: 'VALL'
    } ) 
ON CREATE 
    SET bank522b6b6ed04d40bd9d87d4ecc36fbde2 += 
    { 
        code: 'VALL', 
        country: 'Mongolia'
    }  

MERGE (accountd71d278a8eeb468f9e4517ac1e007fe5)-[:credits]->(transactionba1459c4f7854157be237e7365497fcf) 
MERGE (accountd71d278a8eeb468f9e4517ac1e007fe5)-[:residesWith]->(bank3679799504f54bed9f079848be9c6eff) 
MERGE (transactionba1459c4f7854157be237e7365497fcf)-[:debits]->(account13aa03cd1b6d449e88a3e5e5a22353da) 
MERGE (account13aa03cd1b6d449e88a3e5e5a22353da)-[:residesWith]->(bank522b6b6ed04d40bd9d87d4ecc36fbde2)

Есть идеи, как мне сократить время моего запроса?

Прежде чем предлагать какие-либо идеи, вот что я уже пробовал:

  1. Удаление длинных имен с помощью GUID
  2. Удалить использование анализа даты apoc
  3. Рассматривается использование функции импорта из csv в сборке, но БД находится на другом сервере
  4. Объединение нескольких запросов записи (и в результате, 2 сразу работает лучше)
  5. Созданные ограничения

Заранее спасибо!

K

EXPLAIN

1 Ответ

0 голосов
/ 11 мая 2018

Это список точек для оптимизации вашего процесса:

  • Использовать параметры запроса : Все данные вашего запроса должны быть параметром. Если вы это сделаете, Neo4j не будет повторно вычислять каждый раз, когда планировщик запросов
  • Пакетные запросы : я думаю, что вы делаете одну транзакцию для каждой строки вашего CSV. Попробуйте выполнить ваши запросы (одна транзакция на 1000 строк должна быть в порядке, но если ваш CSV будет расти, вам действительно потребуется больше транзакций)
  • Создать один запрос на узел / создание отношения вместо выполнения одного большого запроса, а для отношения использовать шаблон MATCH MATCH MERGE (у вас есть ограничение, поэтому оно будет быстрым)
...