2015-08-19 4 views
4

Neo4j Version 2.2.4Neo4j Merge не использует уникальный индекс ограничения

Я использую НАГРУЗКИ CSV для импорта огромной коллекции узлов и связей. Я использую MERGE для создания или создания узлов. Для производительности я также создал уникальный индекс для свойства node.

CREATE CONSTRAINT ON (e:RESSOURCE) assert e.url is unique; 

USING PERIODIC COMMIT 10000 
LOAD CSV FROM 'file:///Users/x/data.csv' AS line FIELDTERMINATOR '\t' 
MERGE (subject:RESSOURCE {url: trim(line[0])}) 
MERGE (object:RESSOURCE {url: trim(line[1])}) 
CREATE (subject)-[:EQUIVALENCE]->(object); 

Проблема в том, что импорт около 1Mio. края очень плохие. Я профилировал импорт, а также отдельные запросы MERGE, и я не видел никакого использования уникального индекса. Напротив, запрос MATCH использует индекс. Что я могу сделать, чтобы использовать MERGE с индексом?

ответ

5

Питер правилен, для некоторого более подробного объяснения:

Вы столкнулись с проблемой EAGER, см.: http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/, вы должны увидеть его на выходе EXPLAIN (удалить периодическую фиксацию и использовать объяснение)

+--------------+----------------------------------+-----------------------+ 
| Operator  | Identifiers      | Other     | 
+--------------+----------------------------------+-----------------------+ 
| +EmptyResult |         |      | 
| |   +----------------------------------+-----------------------+ 
| +UpdateGraph | anon[179], line, object, subject | CreateRelationship | 
| |   +----------------------------------+-----------------------+ 
| +UpdateGraph | line, object, subject   | MergeNode; :RESSOURCE | 
| |   +----------------------------------+-----------------------+ 
| +Eager  | line, subject     |      | 
| |   +----------------------------------+-----------------------+ 
| +UpdateGraph | line, subject     | MergeNode; :RESSOURCE | 
| |   +----------------------------------+-----------------------+ 
| +LoadCSV  | line        |      | 
+--------------+----------------------------------+-----------------------+ 

Eager будет тянуть весь ваш файл CSV, чтобы обеспечить изоляцию и эффективно отключить вашу периодическую фиксацию.

Если вы делаете два прохода, можно также попробовать:

CREATE CONSTRAINT ON (e:RESSOURCE) assert e.url is unique; 

USING PERIODIC COMMIT 10000 
LOAD CSV FROM 'file:///Users/x/data.csv' AS line FIELDTERMINATOR '\t' 
FOREACH (url in line[0..1] | 
    MERGE (subject:RESSOURCE {url: trim(url)}) 
); 

USING PERIODIC COMMIT 10000 
LOAD CSV FROM 'file:///Users/x/data.csv' AS line FIELDTERMINATOR '\t' 
MATCH (subject:RESSOURCE {url: trim(line[0])}) 
MATCH (object:RESSOURCE {url: trim(line[1])}) 
CREATE (subject)-[:EQUIVALENCE]->(object); 
+3

Да, это то, что мы делаем в наших процессах импорта. Сначала мы объединяем все узлы с одним или несколькими CSV (по 100000 узлов в каждом), а затем вставляем отношения, используя указанную выше команду MATCH MATCH MERGE. –

+0

потрясающий! Спасибо вам, ребята! –

3

Попробуйте это:

MATCH (subject:RESSOURCE {url: trim(line[0])}), (object:RESSOURCE {url: trim(line[1])}) 
MERGE (subject)-[:EQUIVALENCE]->(object) 

Edit: Я вижу, вы также хотите объединить узлы - я бы предложил делать MERGE для каждого узла:

MERGE (subject:RESSOURCE {url: trim(line[0])}) 

Я также рекомендую делать обрезка, когда вы создаете файл csv, чтобы ограничить количество раз, когда neo4j делает это и упрощает этот cypher.

Edit 2 (благодаря комментарий Кай, который исправил мое вышеуказанное заявление MERGE):

Если вы хотите сделать более сложный сливаться с более свойств вы могли бы сделать это:

MERGE (subject:RESSOURCE {url: trim(line[0])}) 
    ON CREATE SET source=trim(line[1]) 
    ON MERGE SET source=trim(line[1]) 
+0

есть разница между MERGE (тема: Ressource {URL: подрезать (строка [0])}) и MERGE (Тема: RESSOURCE {url: trim (line [0])}) ON CREATE SET subject.url = trim (строка [0]) Я думаю, что слияние уже создает узел в том случае, если он не существует –

+0

Да, ты прав, моя ошибка. Предложения ON CREATE SET (и связанные с ними предложения MATCH SET) необходимы только в том случае, если вы хотите установить другие свойства. –

+0

Правильный совет Петра –

Смежные вопросы