Запрос шифра Neo4J на 5M узлах

#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 имеет тенденцию повышать производительность.