neo4j Cypher 以最佳方式迭代创建关系

neo4j Cypher iteratively creating relationships in optimal way

我正在制作一个社交媒体应用程序,用户可以在其中邀请其他用户列表参加“活动”。编写一个 Cypher 查询以邀请列表中的每个用户参加一个事件——即要在每个用户和事件节点之间创建 INVITED 关系,最佳方法是什么?

我应该反复创建与单个 Cypher 交易的关系吗?我不确定那会是什么样子。或者,我可以遍历 Node.js 后端中的每个用户,并编写一个事务,为列表中的每个用户创建一个 INVITED 关系。我的猜测是后一种方法不是最优的,因为我需要 MATCH 每个交易的相同事件。

你可以在 cypher 中使用列表并结合 UNWIND,你可以用一条语句实现这一点,

WITH ["user1","user2", "user3"] as users 
UNWIND users as user
MATCH (u:User {id: user})
MATCH (e:Event {id: 'event1'}) 
CREATE (u)-[:INVITED]->(e) 

我猜您在开始查询时已经访问了在您的 Node.js 后端上识别用户的内容,例如 id 属性。如果是这样,则查询变为

MATCH (user:User) WHERE user.id IN $user_ids
MATCH (event:Event) WHERE event.id = $event_id
CREATE (user)-[:INVITED_TO]->(event)

此查询将访问数据库一次以获取事件,并为用户 ID 的每个成员访问一次。

然后您可以在从 Node.js 执行查询时传递参数 user_idsevent_id