Создание уникальных отношений занимает много времени
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 ответ
Я отредактировал ваш запрос на шифрование, потому что, кажется, я его понимаю, но едва могу прочитать остальную часть вашего вопроса. Если вы отредактируете его с помощью пробелов и знаков препинания, вам будет легче понять, что вы пытаетесь сделать. До тех пор, вот некоторые мысли о том, что ваш запрос медленный.
- Вы связываете все узлы на графике, это обычно довольно медленно.
- Вы связываете все узлы на графике дважды. Сначала вы связываете универсально в своем предложении start:
names=node(*)
, а затем вы связываете универсально в своем предложении соответствия:MATCH names
и только тогда вы ограничите свой шаблон. Я не совсем знаю, что делает из этого движок Cypher (возможно, он получает мигрень и уходит, чтобы приготовить кофе). Это не нужно, вы можете, по крайней мере, броситьnames=node(*)
из вашего начального предложения. Или отбросьте предложение о совпадении, я полагаю, это тоже может сработать, поскольку вы ничего там не делаете, и вам все равно понадобится начальное предложение, пока вы используете устаревшую индексацию. - Вы используете 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/ и объясните более подробно, как выглядит ваша модель и что вы пытаетесь сделать. Дайте мне знать, если мой ответ соответствует вашему вопросу или я рассмотрю его удаление.