如何在neo4j中一次操作中添加多个关系?

如何在neo4j中一次操作中添加多个关系?,neo4j,Neo4j,我有这样一个函数: void addRelation(string userId,List<string> friends) {} void addRelation(字符串userId,列出好友) {} 我想在friends中添加userId和元素之间的关系。现在我的解决方案是为每一对添加关系,但我发现它的效率很低。如何在一个操作(如批处理)中添加多个关系?以下答案并非基于C,而是假设您正在运行Neo4j 2.x 最简单的解决方法可能是使用一个带参数的Cypher语句: MERG

我有这样一个函数:

void addRelation(string userId,List<string> friends)
{}
void addRelation(字符串userId,列出好友)
{}

我想在friends中添加userId和元素之间的关系。现在我的解决方案是为每一对添加关系,但我发现它的效率很低。如何在一个操作(如批处理)中添加多个关系?

以下答案并非基于C,而是假设您正在运行Neo4j 2.x

最简单的解决方法可能是使用一个带参数的Cypher语句:

MERGE (u:User {userId:{userId}}) 
FOREACH (f in {friends} | MERGE (u)-[:FRIEND_OF]->(:User {userId:f}))
参数(JSON表示法)为:

使用第一个
合并
可以确保用户的节点存在(如果确实存在,可以将
合并
替换为
匹配
)。第二行迭代您的
friends
参数,为每个朋友创建目标节点(除非它存在),并将用户与朋友连接起来

由于我缺乏C#方面的知识,我不知道如何将密码语句发送到服务器,但我可以使用Neo4j的事务http端点,使用
httpie
命令行http客户端为您提供一个示例:

http -b -j localhost:7474/db/data/transaction/commit statements:='[{"statement": "MERGE (u:User {userId:{userId}}) FOREACH (f in {friends} | MERGE (u)-[:FRIEND_OF]->(:User {userId:f}))", "parameters": {"userId":"u1", "friends": ["friend1", "friend2"]} }]'

您应该为您的问题提供更多的上下文:您的目标是什么编程语言?您使用的是Neo4j服务器还是嵌入式模式?如何解析通过用户ID表示用户的节点?很抱歉忘记了缺少的上下文,我使用的是c#和Neo4j服务器模式。所有参数都是userId,首先我会查找两个用户,如果不存在,用相应的userId创建用户,然后添加两个用户之间的关系。非常感谢!听起来正是我需要的。但是我现在不能做测试,因为今天是星期六,所以我不在公司。下周一我会尽快测试它。再次感谢~确定答案正确后我会接受的嗨,Stefan。我照你的建议去做,这很有效。但我发现功能成本会增加的时间。例如:for(int i=0;iI)发现问题。在添加关系时,似乎为朋友中的每个id创建节点。foreach中的合并似乎没有用?当您确定朋友节点已经存在时,可以使用
MATCH(friendNode:User{userId:f})create UNIQUE(u)-[:friend\u OF]->(friendNode)
而不是在
FOREACH
中(尚未验证,但应该可以工作)如果使用match并创建unique,请完整地编写它好吗?如果不使用FOREACH,我不知道如何声明f
http -b -j localhost:7474/db/data/transaction/commit statements:='[{"statement": "MERGE (u:User {userId:{userId}}) FOREACH (f in {friends} | MERGE (u)-[:FRIEND_OF]->(:User {userId:f}))", "parameters": {"userId":"u1", "friends": ["friend1", "friend2"]} }]'