2016-09-16 2 views
0

Когда поиск узлов с определенным почтовым индексом:Merge узел с таким же значением свойства в Neo4j

MATCH (z:ZipCode) WHERE z.zipcode = "2014 AAE" RETURN z.zipcode 

я получаю дубликаты:

z.zipcode 
2014 AAE 
2014 AAE 

Когда я ищу отношения определенного почтовый индекса:

MATCH p=(z:ZipCode)-->() WHERE z.zipcode = "2014 AAE" RETURN p 

я получаю один узел ZipCode 2014 AAE указывающий на дом узла 518Q

Как я могу объединить узлы zipcode с тем же значением свойства, , но оставить все отношения неповрежденными в zipcode?

Edit:

После ответа cybersam, я построил запрос. Это способ объединить узлы с APOC?

MATCH (z1:ZipCode)-->(), (z2:ZipCode)-->() 
WHERE z1.zipcode = z2.zipcode 
AND ID(z1) <> ID(z2) 
WITH COLLECT([z1,z2]) AS zs 
CALL apoc.refactor.mergeNodes(zs) YIELD node 
RETURN node; 

Я получаю это как ошибку:

Type mismatch: expected Collection<Node> but was Collection<Collection<Node>> (line 5, column 31 (offset: 160)) 
"CALL apoc.refactor.mergeNodes(zs) YIELD node" 
+0

Я думаю, что это не возможно, чтобы получить 2 результаты первого запроса и 1 из второго. В первом запросе четко сказано, что есть два узла с определенным «ZipCode». Возможно ли, что есть также некоторый узел 'p' с zipcode' 2014 AAE', который имеет 'IN-отношение ''? Я имею в виду '(z: ZipCode) <-()'. Попробуйте переписать свой второй запрос, чтобы проверить его. Но давно я играл с neo4j, поэтому, возможно, мои мысли ошибочны. – Gondil

+0

Если вы хотите удалить дубликаты, вам просто нужно сопоставить все узлы (соответствующие 2 узлам, например, 'm' и' n'), сравните их, чтобы вы знали, что они одинаковы (имеют одинаковые свойства 'm.zipcode = n.zipcode') но они не совпадают с одним узлом 'm <> n', чем вам нужно найти все отношения' n', которые не находятся в 'm', создайте эти« n-отношения »на узле' m' и, наконец, удалите узел n и все его отношения ». Лучшее решение будет создавать хорошие запросы на создание, поэтому вы объединяете дубликаты во время создания узлов и отношений, и вам не придется это делать позже. – Gondil

+0

@ Gondi: Есть два почтовых индекса, и только один из них связан с отношениями. Итак, результаты из 2 запросов имеют смысл. – cybersam

ответ

2

[ОБНОВЛЕНО]

Помимо: У вас есть 2 узла с тем же почтовым индексом, но только один из этих узлов имеет отношения. Это объясняет ваши результаты.

В neo4j 3.x вы можете установить APOC plugin и использовать процедуру mergeNodes(), которая берет набор узлов. Он объединяет свойства и отношения 2-го по последние узлы на первый узел и удаляет 2-й по последние узлы.

Например:

MATCH (z:ZipCode) 
WHERE z.zipcode = "2014 AAE" 
WITH COLLECT(z) AS zs 
CALL apoc.refactor.mergeNodes(zs) YIELD node 
RETURN node; 
+0

Что означает 'YIELD node'? Что APOC преобразует в единый узел? Я имею в виду их и другие типы YIELD? –

+0

Процедура 'mergeNodes' возвращает (' YIELD ') первый узел из коллекции. См. [Cypher refcard] (http://neo4j.com/docs/cypher-refcard/current/) для получения дополнительной информации о 'CALL' и' YIELD'. – cybersam

+0

Я отредактировал мой вопрос на основе вашего предложения APOC CyberSam. –

Смежные вопросы