我目前正在为一个问题而苦苦挣扎,目前还没有找到任何解决方法。 (我正在使用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();
}
人们可能会遇到用例,将所有关系从一个节点复制到另一个节点:)
有什么办法可以使它起作用?
谢谢
最佳答案
更新,我发现了一种使用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
关于c# - Neo4J-将所有关系从一个节点复制到另一个节点(C#包装器),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36481102/