2015-08-07 2 views
1

Учитывая следующие узлы:Neo4j и Cypher: Создать отношения к узлам, которые имеют аналогичные ключи свойств

create(:ABC{id:'1', a:'axle',b:'bat'}) 
create(:ABC{id:'2', a:'ant',b:'ball',c:'clown'}) 
create(:ABC{id:'3', e:'elk',f:'fog',g:'gaff'}) 
create(:ABC{id:'4', a:'ax',c:'car',z:'zink'}) 

Использование шифра, как бы один создать ребра между узлами, которые разделяют 1 или несколько ключей свойств (независимо от их собственности значение и с неизвестным набором свойств)? Я вполне уверен, что мог выполнять итерацию через узлы по отдельности через python и создавать ребра, но я пробовал без успеха сделать это в cypher.

+0

--------------- –

ответ

1

Вот запрос, который создает связь между каждой парой узлов, которые имеют по меньшей мере одно свойство с тем же именем (игнорируя свойство id, которое имеет все ваши узлы).

MATCH (m),(n) 
WHERE (ID(m) > ID(n)) AND ANY (k IN KEYS(m) 
           WHERE k <> 'id' AND k IN KEYS(n)) 
CREATE (m)-[:SHARES_KEYS_WITH]->(n) 
RETURN m, n; 

Тест ID(m) > ID(n) гарантирует, что мы только оценить каждую пару различных узлов только один раз. (Обратите внимание, что функция ID() возвращает внутренний идентификатор, созданный neo4j, - это не то же самое, что и ваше свойство id.)

+0

Спасибо cybersam, это точно что мне нужно! Это очень помогло мне, так как я часами прорабатывал для ответа. Я пытаюсь расширить это, чтобы также включить количество согласованных ключей: MATCH (m), (n) WHERE (ID (m)> ID (n)) И ЛЮБОЙ (k IN KEYS (m) WHERE k < > 'id' AND k IN KEYS (n)) CREATE (m) - [: SHARES_KEYS_WITH {match_count: count (KEYS (m))}] -> (n) RETURN m, n; –

+0

Вы можете использовать 'LENGTH()' или 'SIZE()' для получения длины коллекции. 'COUNT()' используется только для подсчета строк результатов, и поскольку функция агрегации может использоваться только в предложении 'RETURN' или' WITH'. Кроме того, вам не нужно размещать свойство match_count, так как вы можете использовать запрос Cypher для получения счета; и я не думаю, что ваш 'match_count' не даст вам полезного счета. – cybersam

+0

Пожалуйста, не забудьте проголосовать за ответ, который, по вашему мнению, является полезным (обычно вы делаете это для ответов, которые вы принимаете). – cybersam

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