Neo4j Cypher: перенесите все отношения перед заменой узла другим

Я пытаюсь перенести все входящие и исходящие отношения с одного узла на другой перед удалением первого. у них обоих одинаковый лейбл. Я видел этот Neo4j Cypher: копирование отношений и удаление узла, но в моем если я не знаю тип отношений и хочу передать как входящие, так и исходящие.

Я ищу либо зашифрованный запрос, либо запрос на основе neo4j.rb


person armedwing    schedule 31.01.2015    source источник


Ответы (1)


Я не думаю, что это возможно с помощью чистого шифра. Вот решение с использованием neo4j.rb, которое, я думаю, сработает:

# Assuming node1 already loaded
node_query = Neo4j::Session.query.match(node: {neo_id: node1.neo_id})

types = node_query.match('node-[rel]-()').pluck('DISTINCT type(rel)')

types.each do |type|
  node_query.match('node-[rel]->(other)').with(:node, :rel, :other).create("node-[new_rel]->other").set('new_rel = rel').exec
  node_query.match('node<-[rel]-(other)').with(:node, :rel, :other).create("node<-[new_rel]-other").set('new_rel = rel').exec
end
person Brian Underwood    schedule 01.02.2015
comment
Я получил типы, но затем в каждом цикле я не уверен, как указать другой узел для new_rel. еще раз спасибо Брайан;) - person armedwing; 01.02.2015
comment
Просто редактирую, потому что второй запрос шел в неправильном направлении, и им обоим нужен exec - person Brian Underwood; 01.02.2015
comment
Другой узел определяется переменной other. Это должно быть пропущено в предложении WITH, а затем снова сопоставлено в предложении CREATE. Я мог быть недоразумением ... - person Brian Underwood; 01.02.2015
comment
извините, я все еще борюсь с этим. предполагая, что node1 и node2 загружены, мы хотим передать отношения с node1 на node2. как бы вы использовали предложение WITH в этом случае? - person armedwing; 01.02.2015
comment
Две строки внутри each генерируют шифрованные запросы. with в середине цепочки вызовов метода - это то, что генерирует WITH часть предложения cypher. Я не на 100% уверен, что использование with скопирует свойства одного rel в другой, но я видел, как кто-то использовал ту же технику в другом сообщении SO - person Brian Underwood; 01.02.2015
comment
я уже на полпути. Я могу передать Neo4j :: ActiveRel, но не незаявленные отношения. Я попробовал другой способ, и мне пришлось добавить тест на rel.to_node, чтобы узнать, является ли это Neo4j :: ActiveRel. я до сих пор не знаю, как передать другие `Relations = self.rels (dir:: outgoing) Relations.each do | rel | если определено? rel.to_node new_node.create_rel (rel.type, rel.to_node, rel.props) end end Relations = self.rels (dir:: incoming) Relations.each do | rel | если определено? rel.from_node rel.from_node.create_rel (rel.type, new_node, rel.props) end end ` - person armedwing; 02.02.2015
comment
Здесь становится слишком тесно для комментариев, может быть, откроется новый вопрос? - person Brian Underwood; 02.02.2015
comment
действительно, сделано: stackoverflow.com/questions/28274009/ - person armedwing; 02.02.2015