2015-12-03 3 views
0

Привет, я пытаюсь импортировать некоторые данные из CSV-файлов в Neo4j 2.3.1. Я уже импортировал некоторые узлы типа : Автор и : Статья.Cypher Neo4j - запрос, который использует предложение «IN» в коллекции, очень медленный

Автор узел состоит из свойств, как:

  1. ключа -> Строка
  2. principal_name -> Строка
  3. псевдоним -> Коллекция Строка
  4. ........

Я также добавил индекс на имя_имя, псевдоним и ключ.

Проблема возникает, когда я пытаюсь импортировать отношения между узлами типа Article и Author.

CSV-имеет этот тип структуры:

articleKey,authorName 

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

USING PERIODIC COMMIT 1000 
LOAD CSV WITH HEADERS FROM "file:///myPath.csv" AS line 
MATCH (art:Article{key: line.key1}) 
MATCH (auth:Author) WHERE line.key2 IN (auth.alias) 
CREATE UNIQUE (auth)-[:AUTHOR_OF]->(art); 

Запроса мучительно медленно потому что второй MATCH действительно медленный, поскольку я обнаружил использование профилировщика. Требуется 10-12 секунд, чтобы создать каждое отношение, потому что у меня много авторов в db (около 1000000).

Так что я искал способ, чтобы выполнить запрос, как этот, чтобы получить более быстрое выполнение (пример для иллюстрации структуры, я хочу получить):

MATCH (auth:Author{principal_name: line.key2}) 
IF auth null THEN 
    MATCH (auth:Author) WHERE line.key2 IN (auth.alias) 
END 

Там есть способ сделать это с Сайфером?

ответ

1

Если вы изменили свою модель, чтобы все имена давал Author узла (как основное имя и все псевдонимы) находятся в отдельных Name узлов, например:

(auth:Author)-[:HAS_NAME]->(name:Name {name: 'Fred McGillicutty'}) 

Тогда запрос будет просто :

USING PERIODIC COMMIT 1000 
LOAD CSV WITH HEADERS FROM "file:///myPath.csv" AS line 
MATCH 
    (art:Article { key: line.key1 }), 
    (auth:Author)-[:HAS_NAME]->(name:Name { name:line.key2 }) 
CREATE (auth)-[:AUTHOR_OF]->(art); 

При создании индексов :Article(key) и :Name(name), этот запрос должен быть очень эффективным.

+0

Предлагаемое решение такое же, как я думал, для более быстрого выполнения запроса. Когда я смоделировал данные, наивно думал, что добавление индекса в сборник решит проблему. Вместо этого я вижу из профилировщика, что индекс в коллекции не используется для ответа на запрос. –

0

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

(:Alias)<-[:HAS]-(:Author)-[:AUTHOR_OF]->(:Article) 

Добавить индексы на все узлы. Если возможно, используйте uniqueness constraints.

Теперь вы можете запросить Alias и Author узлов для добавления отношения:

USING PERIODIC COMMIT 1000 
LOAD CSV WITH HEADERS FROM "file:///myPath.csv" AS line 
MATCH (art:Article {key: line.key1}) 
// get the Author directly or by alias 
MATCH (alias:Alias)<-[:HAS]-(auth:Author) 
WHERE alias.principal_name = line.key2 OR auth.principal_name = line.key2 
CREATE (auth)-[:AUTHOR_OF]->(art) 

С индексирует поиски должны быть довольно быстро.

+0

Спасибо за ваш ответ, решение, которое вы предложили, очень похоже на предложение, предлагаемое компанией @cybersam. Я выбираю другой только потому, что он более общий. В конце - та же идея, что мне пришлось разобраться. Но мне было интересно, почему индекс в коллекции никогда не использовался. –

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