首页 > 解决方案 > Neo4j 匹配某类节点的随机单个节点

问题描述

我有一个组节点,用户是其中的成员。我想在注册时随机将用户自动分配给组。有没有办法随机匹配某种类型的单个节点。

MATCH (g:Group) return g

以上将为我提供所有组。要创建关系,我将执行以下操作:

MATCH (u:User {id: <ID>}), (g:Group {id: <ID>}) CREATE (u)-[r:MEMBER_OF]->(g) RETURN type(r)

但我想做这样的事情:

CREATE(u:User {
  id: apoc.create.uuid(), 
  firstName: $firstName, 
  username: $username, 
  phoneNumber: $phoneNumber, 
  createdAt: datetime(),
  updatedAt: datetime(),
  role: 'USER'
  }
)
  WITH u
  MATCH (g:Group)
  //
  CREATE (u)-[:MEMBER_OF]->(g)
  return u

我将匹配一个随机组,然后创建 MEMBER_OF 关系。最终可能会有其他考虑,但现在我只想随机选择一个组,然后创建关系。

标签: neo4jcypher

解决方案


您可以使用 apoc 函数apoc.coll.randomItem从所有节点的集合中挑选出一个随机Group节点:

MATCH (x:Group)
WITH datetime() AS dt, apoc.coll.randomItem(COLLECT(x)) AS g
CREATE (u:User {
  id: apoc.create.uuid(), 
  firstName: $firstName, 
  username: $username, 
  phoneNumber: $phoneNumber, 
  createdAt: dt,
  updatedAt: dt,
  role: 'USER'
})-[:MEMBER_OF]->(g)
RETURN u

推荐阅读