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

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

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

node_query = Neo4j::Session.query.match(old_node: {uuid: node1.uuid}).match(new_node: {uuid: node2.uuid})

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

types.each do |type|
  node_query.match('old_node-[rel]->(other)').with(:old_node, :rel, :other).create("new_node-[new_rel]->other").set('new_rel = rel').exec
  node_query.match('old_node<-[rel]-(other)').with(:old_node, :rel, :other).create("new_node<-[new_rel]-other").set('new_rel = rel').exec
end

Когда я попытался реализовать это, я получаю эту ошибку

new_rel not defined (line 1, column 160)
"MATCH
  (old_node {uuid: "YYYY"}),
  (new_node {uuid: "XXXX"}),
  oldnode-[rel]->(other)
WITH old_node, rel, other SET new_rel = rel
CREATE new_node-[new_rel]->other" ^

Я попробовал другой способ, который работает только для ссылок Neo4j::ActiveRel, потому что для остальных нет свойства to_node. Кажется, что он все равно не копирует свойства отношений:

relations = old_node.rels(dir: :outgoing)
relations.each do |rel|
  if defined? 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|
  if defined? rel.from_node
    rel.from_node.create_rel(rel.type, new_node, rel.props)
  end
end

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


Ответы (2)


Ах, теперь, когда я вижу ошибку, я думаю, что знаю, что было не так с первоначальным ответом. Я также рассмотрю ваше другое решение, но вот как я бы исправил оригинал (добавив разрыв, чтобы SET шло после CREATE):

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

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

types.each do |type|
  node_query.match('node-[rel:#{type}]->(other)').
    where('other <> new_node').
    with(:node, :new_node, :rel, :other).
    create("new_node-[new_rel:#{type}]->other").
    break.set('new_rel = rel').exec

  node_query.match('node<-[rel:#{type}]-(other)').
    where('other <> new_node').
    with(:node, :new_node, :rel, :other).
    create("new_node<-[new_rel:#{type}]-other").
    break.set('new_rel = rel').exec
end
person Brian Underwood    schedule 02.02.2015
comment
спасибо Брайан. теперь у меня эта ошибка: A single relationship type must be specified for CREATE (line 1, column 171) - person armedwing; 02.02.2015
comment
хорошо, ваш запрос работает, но он предназначен для создания другой связи между теми же узлами. если я заменю node-[new_rel:#{type}]->other на newnode-[new_rel:#{type}]->other, это ничего не создаст. вы понимаете, что я имею в виду (посмотрите на мой код вверху страницы)? - person armedwing; 02.02.2015
comment
;) идеально ! извините за такую ​​медлительность... я выполнял сопоставление в первом запросе... как бы вы исключили связь между узлом и новым узлом (если он существует), чтобы новый узел не заканчивался отношение к себе? что-то вроде .not(:node, {neo_id: new_node.neo_id}) ? - person armedwing; 03.02.2015

Что касается вашего другого решения, я не слишком хорошо знаком с методом rels (и, похоже, не могу его найти), но я предполагаю, что он возвращает объекты CypherRelationship или ActiveRel. На самом деле я немного удивлен, что это работает, только если вы определяете ActiveRel модели, потому что он должен возвращать CypherRelationship объектов, если они не определены.

Однако я предполагаю, что ваша проблема заключается в том, что вам, вероятно, нужно использовать start_node и end_node вместо from_node и to_node. Вероятно, нам следует стандартизировать это...


РЕДАКТИРОВАТЬ: я редактирую это, чтобы добавить Neo4j::Server::CypherRelationship, который возвращается, когда он не является ActiveRel. нет ни start_node, ни from node :

{
"session": {
    "connection": {
        "parallel_manager": null,
        "headers": {
            "Content-Type": "application/json",
            "User-Agent": "neo4j-gem/4.1.2 (https://github.com/neo4jrb/neo4j)",
            "Authorization": "Basic realm=\"Neo4j\" OjdhYTUxNTcyYzBmMzBkYTMyNmY0NWQwMDc4ZTRlY2Rk"
        },
        "params": {},
        "options": {
            "params_encoder": null,
            "proxy": null,
            "bind": null,
            "timeout": null,
            "open_timeout": null,
            "boundary": null,
            "oauth": null
        },
        "ssl": {
            "verify": null,
            "ca_file": null,
            "ca_path": null,
            "verify_mode": null,
            "cert_store": null,
            "client_cert": null,
            "client_key": null,
            "certificate": null,
            "private_key": null,
            "verify_depth": null,
            "version": null
        },
        "default_parallel_manager": null,
        "builder": {
            "handlers": [
                {
                    "name": "Faraday::Request::BasicAuthentication",
                    "args": [
                        "neo4j",
                        "hroads"
                    ],
                    "block": null
                },
                {
                    "name": "FaradayMiddleware::EncodeJson",
                    "args": [],
                    "block": null
                },
                {
                    "name": "FaradayMiddleware::ParseJson",
                    "args": [
                        {
                            "content_type": "application/json"
                        }
                    ],
                    "block": null
                },
                {
                    "name": "Faraday::Adapter::NetHttpPersistent",
                    "args": [],
                    "block": null
                }
            ],
            "app": {
                "header_value": "Basic bmVvNGo6aHJvYWRz",
                "app": {
                    "app": {
                        "app": {
                            "app": {}
                        },
                        "options": {
                            "content_type": "application/json"
                        },
                        "content_types": [
                            "application/json"
                        ]
                    }
                }
            }
        },
        "url_prefix": {
            "scheme": "http",
            "user": null,
            "password": null,
            "host": null,
            "port": 80,
            "path": "/",
            "query": null,
            "opaque": null,
            "registry": null,
            "fragment": null,
            "parser": null
        },
        "proxy": null
    },
    "auth": {
        "url": "http://localhost:7474",
        "connection": {
            "parallel_manager": null,
            "headers": {
                "Content-Type": "application/json",
                "User-Agent": "neo4j-gem/4.1.2 (https://github.com/neo4jrb/neo4j)",
                "Authorization": "Basic realm=\"Neo4j\" OjdhYTUxNTcyYzBmMzBkYTMyNmY0NWQwMDc4ZTRlY2Rk"
            },
            "params": {},
            "options": {
                "params_encoder": null,
                "proxy": null,
                "bind": null,
                "timeout": null,
                "open_timeout": null,
                "boundary": null,
                "oauth": null
            },
            "ssl": {
                "verify": null,
                "ca_file": null,
                "ca_path": null,
                "verify_mode": null,
                "cert_store": null,
                "client_cert": null,
                "client_key": null,
                "certificate": null,
                "private_key": null,
                "verify_depth": null,
                "version": null
            },
            "default_parallel_manager": null,
            "builder": {
                "handlers": [
                    {
                        "name": "Faraday::Request::BasicAuthentication",
                        "args": [
                            "neo4j",
                            "hroads"
                        ],
                        "block": null
                    },
                    {
                        "name": "FaradayMiddleware::EncodeJson",
                        "args": [],
                        "block": null
                    },
                    {
                        "name": "FaradayMiddleware::ParseJson",
                        "args": [
                            {
                                "content_type": "application/json"
                            }
                        ],
                        "block": null
                    },
                    {
                        "name": "Faraday::Adapter::NetHttpPersistent",
                        "args": [],
                        "block": null
                    }
                ],
                "app": {
                    "header_value": "Basic bmVvNGo6aHJvYWRz",
                    "app": {
                        "app": {
                            "app": {
                                "app": {}
                            },
                            "options": {
                                "content_type": "application/json"
                            },
                            "content_types": [
                                "application/json"
                            ]
                        }
                    }
                }
            },
            "url_prefix": {
                "scheme": "http",
                "user": null,
                "password": null,
                "host": null,
                "port": 80,
                "path": "/",
                "query": null,
                "opaque": null,
                "registry": null,
                "fragment": null,
                "parser": null
            },
            "proxy": null
        },
        "params": {
            "basic_auth": {
                "username": "neo4j",
                "password": "hroads"
            }
        },
        "token": "7aa51572c0f30da326f45d0078e4ecdd"
    },
    "resource_url": "http://localhost:7474/db/data/",
    "resource_data": {
        "extensions": {},
        "node": "http://localhost:7474/db/data/node",
        "node_index": "http://localhost:7474/db/data/index/node",
        "relationship_index": "http://localhost:7474/db/data/index/relationship",
        "extensions_info": "http://localhost:7474/db/data/ext",
        "relationship_types": "http://localhost:7474/db/data/relationship/types",
        "batch": "http://localhost:7474/db/data/batch",
        "cypher": "http://localhost:7474/db/data/cypher",
        "indexes": "http://localhost:7474/db/data/schema/index",
        "constraints": "http://localhost:7474/db/data/schema/constraint",
        "transaction": "http://localhost:7474/db/data/transaction",
        "node_labels": "http://localhost:7474/db/data/labels",
        "neo4j_version": "2.2.0-M02"
    }
},
"response_hash": {
    "extensions": {},
    "metadata": {
        "id": 2000,
        "type": "LEAD_TO"
    },
    "data": {
        "created_at": 1422832907
    },
    "property": "http://localhost:7474/db/data/relationship/2000/properties/{key}",
    "start": "http://localhost:7474/db/data/node/1266",
    "self": "http://localhost:7474/db/data/relationship/2000",
    "end": "http://localhost:7474/db/data/node/1264",
    "type": "LEAD_TO",
    "properties": "http://localhost:7474/db/data/relationship/2000/properties",
    "id": 2000
},
"rel_type": "LEAD_TO",
"props": {
    "created_at": 1422832907
},
"start_node_neo_id": 1266,
"end_node_neo_id": 1264,
"id": 2000

}

person Brian Underwood    schedule 02.02.2015