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_ids
和 event_id
。
我正在制作一个社交媒体应用程序,用户可以在其中邀请其他用户列表参加“活动”。编写一个 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_ids
和 event_id
。