Застрял после ~ 500 вставок - PullRequest
0 голосов
/ 22 января 2019

Я вставляю узлы и отношения в мою базу данных neo4j (graphenedb, но также происходит локально).Приблизительно после 500 вставок вставьте уставку.После перезапуска сервера neo4j та же самая вставка работает как обычно, и я могу продолжить со следующими ~ 500 вставками.

У вас есть какие-либо подсказки, почему он застревает?

Один оператор вставки выглядитследующее:

MERGE (b0:Company{company_id:{b1},universal_name:{b2},company_name:{b3}})
ON CREATE SET b0.funding_total_usd = null
ON MATCH SET b0.funding_total_usd = null

MERGE (b13:Industry{name:{b12}})
MERGE (b0)-[:company_industry]->(b13)
MERGE (b15:Category{name:{b14}})
MERGE (b0)-[:company_category]->(b15)
MERGE (b17:Category{name:{b16}})
MERGE (b0)-[:company_category]->(b17)
MERGE (b19:Category{name:{b18}})
MERGE (b0)-[:company_category]->(b19)
MERGE (b21:Category{name:{b20}})
MERGE (b0)-[:company_category]->(b21)
MERGE (b23:Category{name:{b22}})
MERGE (b0)-[:company_category]->(b23)
MERGE (b25:Category{name:{b24}})
MERGE (b0)-[:company_category]->(b25)
MERGE (b27:Category{name:{b26}})
MERGE (b0)-[:company_category]->(b27)

Имеются индексы:

Indexes
   ON :Category(name) ONLINE  (for uniqueness constraint)
   ON :Company(company_id) ONLINE  (for uniqueness constraint)
   ON :Company(universal_name) ONLINE  (for uniqueness constraint)
   ON :Industry(name) ONLINE  (for uniqueness constraint)

Constraints
   ON ( category:Category ) ASSERT category.name IS UNIQUE
   ON ( company:Company ) ASSERT company.company_id IS UNIQUE
   ON ( company:Company ) ASSERT company.universal_name IS UNIQUE
   ON ( industry:Industry ) ASSERT industry.name IS UNIQUE

Я использую следующий код PHP для отправки заявления:

    $config = \GraphAware\Bolt\Configuration::create()
                           ->withCredentials($user, $pw)
                           ->withTimeout($timeout);
    if($ssl) {
        $config = $config->withTLSMode(\GraphAware\Bolt\Configuration::TLSMODE_REQUIRED);
    }

    $driver = \GraphAware\Bolt\GraphDatabase::driver($uri, $config);
    $driver->session()->run($query, $binds);

Протестированные версии: 3.4.12 и3.5.1

@ edit: добавлен код, который используется для отправки выписки, и версия neo4j.

1 Ответ

0 голосов
/ 22 января 2019

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

См. Некоторые из наших советов и рекомендаций по дозированию .

Применительно к вашему запросу ваш параметр ввода для пакета может выглядеть примерно так:

{записи: [{companyId: 12345, universalName: 'foo', companyName: 'bar', отрасль: «отрасль», категории: [{name: 'cat1'}, {name: 'cat2'}, {Имя: 'cat3'}]}]}

И сам запрос на пакетное выполнение может выглядеть так:

UNWIND $entries as entry
MERGE (c:Company{company_id:entry.companyId, universal_name:entry.universalName, company_name:entry.companyName})
SET c.funding_total_usd = null

MERGE (industry:Industry{name:entry.industry})
MERGE (c)-[:company_industry]->(industry)

WITH entry, c
UNWIND entry.categories as cat
MERGE (category:Category{name:cat.name})
MERGE (c)-[:company_category]->(category)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...