Neo4j匹配某类节点的随机单个节点

Neo4j match a random single node of a certain type of nodes

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

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 关系。最终可能会有其他考虑,但现在我想随机 select 一组然后创建关系。

您可以使用 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