Neo4J-将所有关系从一个节点复制到另一个节点(C#包装器)

Ashallar

我目前正在为一个问题而苦苦挣扎,目前还没有找到任何解决方法。(我正在使用NEO4J C#库)

我需要将两个节点合并到第三个节点中,然后将所有关系(类型和属性)从这两个节点复制到我新创建的第三个节点中:

(a:Label)-[r]-()
(b:Label)-[r2]-()
(c:Label)

我已经能够正确地检索我的两个第一个节点并将其合并到数据库中创建的第三个节点,但是我正努力将所有关系从两个第一个节点复制到第三个节点。

我尝试了几项没有成功的事情,例如:

        using (GraphClient graphClient = GetGraphClient())
        {
            var inputString = string.Format("({0}:{1})-[r]->(n), ({2}:{3})", "a", typeof(Label).Name, "b", typeof(Label).Name);
            var query = graphClient.Cypher
                    .SendQueryOnMaster()
                    .Match(inputString)
                    .Where((Label a) => a.Id == from.Id)
                    .AndWhere((Label b) => b.Id == to.Id)
                    .Create("(b)-[r2:type(r)]->(n)");
            query.ExecuteWithoutResults();
        }

将所有关系从一个节点复制到另一个节点可能是人们可能遇到的用例:)

有什么办法可以使它起作用?

谢谢

Ashallar

更新,我发现了一种使用C#包装器将所有关系从一个节点复制到另一个节点的方法。

    internal static void DuplicateRelationships<T>(T from, T to) where T : IDataObject
    {
        string aVariable = "a";
        string bVariable = "b";
        string nVariable = "n";
        string relationVariable = "r";
        string newRelation = "r2";
        string relationsVariable = "rels";
        string relationPostCollectVariable = "rel";

        Guid fromId = from.Id;
        Guid toId = to.Id;

        foreach (string relation in CypherVerbs.GetAllVerbs())
        {
            using (GraphClient graphClient = GetGraphClient())
            {
                /*-[r]->*/
                graphClient.Cypher
                    .SendQueryOnMaster()
                    .Match(string.Format("({0}:{1})-[{2}:{3}]->({4}), ({5}:{6})", aVariable, from.GetType().Name, relationVariable, relation, nVariable, bVariable, to.GetType().Name))
                    .Where((T a) => a.Id == fromId)
                    .AndWhere((T b) => b.Id == toId)
                    .With(string.Format("COLLECT({0}) AS {1}, {2}, {3}, {4}", relationVariable, relationsVariable, aVariable, bVariable, nVariable))
                    .ForEach(string.Format("({0} in {1} | ", relationPostCollectVariable, relationsVariable))
                    .Create(string.Format("({0})-[{1}:{2}]->({3})", bVariable, newRelation, relation, nVariable))
                    .Set(string.Format("{0} += {1})", newRelation, relationPostCollectVariable))
                    .ExecuteWithoutResults();

                /*<-[r]-*/
                graphClient.Cypher
                    .SendQueryOnMaster()
                    .Match(string.Format("({0}:{1})<-[{2}:{3}]-({4}), ({5}:{6})", aVariable, from.GetType().Name, relationVariable, relation, nVariable, bVariable, to.GetType().Name))
                    .Where((T a) => a.Id == fromId)
                    .AndWhere((T b) => b.Id == toId)
                    .With(string.Format("COLLECT({0}) AS {1}, {2}, {3}, {4}", relationVariable, relationsVariable, aVariable, bVariable, nVariable))
                    .ForEach(string.Format("({0} IN {1} | ", relationPostCollectVariable, relationsVariable))
                    .Create(string.Format("({0})<-[{1}:{2}]-({3})", bVariable, newRelation, relation, nVariable))
                    .Set(string.Format("{0} += {1})", newRelation, relationPostCollectVariable))
                    .ExecuteWithoutResults();
            }
        }
    }

这是密码:

MATCH (a:Test {props1:"1"}), (b:Test {props3:"3"})
WITH a,b
MATCH (a)-[r:LINKED_TO]->(c)
WITH COLLECT(r) AS rels, a, b, c
FOREACH (rel in rels |
       CREATE (b)-[r:LINKED_TO]->(c)
       SET r+=rel
)

编辑:自Neo4j 3.0以来,您可以使用存储过程来更有效地执行此操作,Michael Hunger开发了几种模板存储过程,包括将所有关系从一个节点复制到另一过程。

这是存储过程存储库的链接:https : //github.com/neo4j-contrib/neo4j-apoc-procedures

这是图形重构文档的链接:https : //neo4j-contrib.github.io/neo4j-apoc-procedures/#_graph_refactoring

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Neo4J-将所有关系从一个节点复制到另一个节点(C#包装器)

来自分类Dev

如果属性存在,则 Neo4J 合并节点并创建另一个具有关系的节点

来自分类Dev

Neo4j.rb:在将一个节点替换为另一个节点之前,先转移所有关系

来自分类Dev

Neo4j Cypher:按与另一个节点的关系对节点进行分组

来自分类Dev

Neo4j匹配与一个或另一个节点相关的节点

来自分类Dev

Neo4j - 从一个节点遍历到另一个由父节点间接连接的节点

来自分类Dev

Neo4j密码使用ALL关系获取与另一个节点相关的节点

来自分类Dev

Neo4j如何获得(DISTINCT)所有节点以及与至少一个相同节点的关系?

来自分类Dev

Neo4j:跳过甚至只有一个与查询匹配的关系的节点

来自分类Dev

Cypher (Neo4j) - 只要节点中的一个关系满足条件而不管搜索路径如何,查找所有关系?

来自分类Dev

在 Neo4j 中,我们如何使用 graphql 将生成查询后获得的键值对存储到另一个现有节点中?

来自分类Dev

cypher Neo4j 中从一个查询到另一个查询的管道结果

来自分类Dev

neo4j创建子节点并将其链接到另一个子节点

来自分类Dev

neo4j找到一个节点来建立关系

来自分类Dev

Neo4j 仅显示 1 对多关系的一个节点

来自分类Dev

Neo4j,获取一组节点之间的所有关系

来自分类Dev

Neo4j:获取一组节点内的所有关系

来自分类Dev

在neo4j密码中找到一个节点及其所有传入和传出节点

来自分类Dev

将认证数据存储在neo4j节点中是一个好习惯吗?

来自分类Dev

选择随机节点neo4j

来自分类Dev

Neo4J:避免重复节点

来自分类Dev

迭代neo4j中的节点

来自分类Dev

Dom4j从一个xml分离/复制节点并添加到另一个

来自分类Dev

neo4j条件关系

来自分类Dev

Neo4j,匹配关系在何处

来自分类Dev

Neo4j关系的属性

来自分类Dev

Neo4j亲子关系

来自分类Dev

在neo4j中建立关系

来自分类Dev

Neo4j双向关系

Related 相关文章

  1. 1

    Neo4J-将所有关系从一个节点复制到另一个节点(C#包装器)

  2. 2

    如果属性存在,则 Neo4J 合并节点并创建另一个具有关系的节点

  3. 3

    Neo4j.rb:在将一个节点替换为另一个节点之前,先转移所有关系

  4. 4

    Neo4j Cypher:按与另一个节点的关系对节点进行分组

  5. 5

    Neo4j匹配与一个或另一个节点相关的节点

  6. 6

    Neo4j - 从一个节点遍历到另一个由父节点间接连接的节点

  7. 7

    Neo4j密码使用ALL关系获取与另一个节点相关的节点

  8. 8

    Neo4j如何获得(DISTINCT)所有节点以及与至少一个相同节点的关系?

  9. 9

    Neo4j:跳过甚至只有一个与查询匹配的关系的节点

  10. 10

    Cypher (Neo4j) - 只要节点中的一个关系满足条件而不管搜索路径如何,查找所有关系?

  11. 11

    在 Neo4j 中,我们如何使用 graphql 将生成查询后获得的键值对存储到另一个现有节点中?

  12. 12

    cypher Neo4j 中从一个查询到另一个查询的管道结果

  13. 13

    neo4j创建子节点并将其链接到另一个子节点

  14. 14

    neo4j找到一个节点来建立关系

  15. 15

    Neo4j 仅显示 1 对多关系的一个节点

  16. 16

    Neo4j,获取一组节点之间的所有关系

  17. 17

    Neo4j:获取一组节点内的所有关系

  18. 18

    在neo4j密码中找到一个节点及其所有传入和传出节点

  19. 19

    将认证数据存储在neo4j节点中是一个好习惯吗?

  20. 20

    选择随机节点neo4j

  21. 21

    Neo4J:避免重复节点

  22. 22

    迭代neo4j中的节点

  23. 23

    Dom4j从一个xml分离/复制节点并添加到另一个

  24. 24

    neo4j条件关系

  25. 25

    Neo4j,匹配关系在何处

  26. 26

    Neo4j关系的属性

  27. 27

    Neo4j亲子关系

  28. 28

    在neo4j中建立关系

  29. 29

    Neo4j双向关系

热门标签

归档