Как объединить узлы, которые имеют одинаковое значение для свойства name в Neo4j
Я просто помещаю текстовый корпус в базу данных Neo4j. Когда я выполню MATCH (n) RETURN n
Cypher-запрос возвращает несколько узлов с одинаковым именем. Как я могу объединить эти узлы в один?
1 ответ
Ваши значения имени имеют разные значения из-за прописных и строчных букв ("Java" и "Java" различаются).
Я воспроизвел ваш сценарий, создав образец набора данных:
CREATE (n1:Node {name : "Java"}),
(n2:Node {name : "Java"}),
(n3:Node {name : "java"}),
(n1)-[:TYPE]->(),
(n1)-[:TYPE]->(),
(n1)-[:TYPE]->(),
(n2)-[:TYPE]->(),
(n2)-[:TYPE]->(),
(n3)-[:TYPE]->()
Приведенный выше запрос создаст этот график:
Для объединения всех узлов "Java" вы можете использовать процедуру APOC apoc.refactor.mergeNodes(nodes)
, Выполнение следующего запроса:
MATCH (n:Node)
// using toLower function to group nodes with the same name but
// different cases (eg Java, java, javA)
WITH toLower(n.name) as name, collect(n) as nodes
// passing the nodes collection to mergeNodes APOC procedure
CALL apoc.refactor.mergeNodes(nodes) yield node
RETURN *
Обновим ваш график: