#neo4j #cypher
Вопрос:
Это основной запрос, который я пытаюсь выполнить:
MATCH (b1:Business),(b2:Business) WHERE ID(b1)<>ID(b2) AND b1.name[0]=b2.name[0]
WITH b1,b2,apoc.create.uuid() as uuid
MERGE (b1)-[d:MCC_NAME]->(b2)
ON CREATE
SET d.m_score = 100
SET d.m_event = uuid
SET d.m_dt = datetime()
RETURN count (d)
Я также попытался отделить запрос и выполнить его с помощью apoc.periodic.iterate (), но в любом случае запрос выполняется вечно и никогда не дает результатов. Свойство name представляет собой массив, но в настоящее время в нем есть только отдельные записи, поэтому я попытался упростить его, используя простое сравнение name[0], но это не помогло. База данных довольно большая, около 5 миллионов узлов. Любой совет приветствуется.
Ответ №1:
Я бы сделал это:
MATCH (b1:Business)
WITH b1
MATCH(b2:Business) WHERE b1.name[0]=b2.name[0] AND b1<>b2
WITH b1,b2,apoc.create.uuid() as uuid
MERGE (b1)-[d:MCC_NAME]->(b2)
SET …
Убедитесь, что у вас установлен индекс name
.
Если вы не хотите, чтобы края были двунаправленными, вы могли бы сделать
WHERE id(b1)>id(b2)
Комментарии:
1. Спасибо, но проблема в том, что обе стороны являются списками, так что b2.name это тоже список.
2. @WarwickMatthews извините, что я упустил это из виду, но моя главная мысль заключается в том, что отделение b1 от b2 имеет тенденцию повышать производительность.