Создание уникальных отношений занимает много времени

START names = node(*),
  target=node:node_auto_index(target_name="TARGET_1")
MATCH names 
WHERE NOT names-[:contains]->() 
  AND HAS (names.age)
  AND (names.qualification =~ ".*(?i)B.TECH.*$" 
    OR names.qualification =~ ".*(?i)B.E.*$") 
CREATE UNIQUE (names)-[r:contains{type:"declared"}]->(target)
RETURN names.name,names,names.qualification

Я состоит из почти 180000 имен узлов, я повторил описанный выше процесс, чтобы создать уникальные отношения более 100 раз, изменив цель. это занимает слишком много времени. Как я могу решить это..

я строю запрос с помощью Java и iterated.iam, используя neo4j 2.0.0.5 и Java 1.7 .

1 ответ

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

  1. Вы связываете все узлы на графике, это обычно довольно медленно.
  2. Вы связываете все узлы на графике дважды. Сначала вы связываете универсально в своем предложении start: names=node(*), а затем вы связываете универсально в своем предложении соответствия: MATCH namesи только тогда вы ограничите свой шаблон. Я не совсем знаю, что делает из этого движок Cypher (возможно, он получает мигрень и уходит, чтобы приготовить кофе). Это не нужно, вы можете, по крайней мере, бросить names=node(*) из вашего начального предложения. Или отбросьте предложение о совпадении, я полагаю, это тоже может сработать, поскольку вы ничего там не делаете, и вам все равно понадобится начальное предложение, пока вы используете устаревшую индексацию.
  3. Вы используете Neo4j 2.x, но вы используете устаревшую индексацию вместо меток, по крайней мере, в этом запросе. Не зная ваших данных и модели, трудно понять, какая разница будет для производительности, но это, безусловно, облегчит написание (и чтение) ваших запросов. Итак, это другой тип медленного. Вполне вероятно, что если бы у вас были ярлыки и индексы ярлыков, производительность запросов улучшалась бы.

Итак, сначала попробуйте удалить одну из универсальных привязок узлов, а затем используйте инструменты схемы 2.x для структурирования ваших данных. Вы должны быть в состоянии написать запросы, как

MATCH target:Target
WHERE target.target_name="TARGET_1"
WITH target
MATCH names:Name
WHERE NOT names-[:contains]->() 
  AND HAS (names.age)
  AND (names.qualification =~ ".*(?i)B.TECH.*$" 
    OR names.qualification =~ ".*(?i)B.E.*$") 
CREATE UNIQUE (names)-[r:contains{type:"declared"}]->(target)
RETURN names.name,names,names.qualification

Однако я не знаю, будет ли такой запрос быстрым для ваших данных. Если вы поместите метку "Имя" на все ваши узлы, то MATCH names:Name будет по-прежнему связывать все узлы в базе данных, поэтому, вероятно, все еще будет медленным

PS отношения, которые вы создаете, имеют TYPE называется containsи вы даете им свойство под названием type со значением declared, Может быть, у вас есть веская причина, но это потенциально очень запутанно.

Редактировать:
Прочитав ваш вопрос и мой ответ снова, я больше не думаю, что понимаю даже ваш запрос на шифрование. (Почему вы возвращаете как связанные узлы, так и свойства этих узлов?) Пожалуйста, рассмотрите возможность размещения примеров данных на http://console.neo4j.org/ и объясните более подробно, как выглядит ваша модель и что вы пытаетесь сделать. Дайте мне знать, если мой ответ соответствует вашему вопросу или я рассмотрю его удаление.

Другие вопросы по тегам