为每个 cypher-neo4j 创建关系

Create relationship at for each cypher-neo4j

我的后端有一条语句可以触发查询。 此语句正在检查我的 neo4j 数据库中存在的最大插槽数,然后它创建了 50 个插槽,每个插槽都有一个。

MATCH (s:Slot)
WITH MAX(s.number) AS maxSlotNumber
WITH COALESCE(maxSlotNumber, 0) AS lastExistingSlotNumber
FOREACH (i in range(lastExistingSlotNumber+1, lastExistingSlotNumber+50) | CREATE (:Slot {number: i}))

我现在需要的是这 50 个新创建的插槽中的每一个都将与一个名为 box 的新节点建立关系。 这背后的原理是每个盒子包含 50 个插槽。如果 50 个插槽已满,我将填充我的后端并且没有其他空闲插槽存在,则此查询应创建 50 个新插槽和 1 个框。 我试过了:

MATCH (s:Slot)
CREATE (b:Box{number:1})
WITH MAX(s.number) AS maxSlotNumber
WITH COALESCE(maxSlotNumber, 0) AS lastExistingSlotNumber
FOREACH (i in range(lastExistingSlotNumber+1, lastExistingSlotNumber+50) | CREATE (:Slot {number: i})-[:in_box]->(b))

但是这个语句创建了 100 个新节点并且每个节点都与自己的盒子有关系。 Diagram Link

所需的结果在图表中应该看起来像这样但是当然有 50 个插槽,我只画了 3 个。

第二个问题。 你会如何推荐新盒子的创建?在上面的代码中,我对数字 1 进行了硬编码。但是当其 50 个插槽的 box1 已满时,应该创建一个编号为 2 且插槽从 51 到 100 的新框。

您的查询的第一个问题是您在定义 maxSlotNumber 时丢失了 b。这将修复它:

CREATE (b:Box{number:1})
WITH b
OPTIONAL MATCH (s:Slot)
WITH COALESCE(MAX(s.number), 0) AS lastExistingSlotNumber, b
FOREACH (i in range(lastExistingSlotNumber+1, lastExistingSlotNumber+50) | CREATE (:Slot {number: i})-[:IN_BOX]->(b))

关于盒子节点的创建,可以这样:

OPTIONAL MATCH (b:Box) WITH COALESCE(MAX(b.number), 0)+1 as lastBoxNumber
CREATE (b:Box {number: lastBoxNumber})
WITH b
OPTIONAL MATCH (s:Slot)
WITH COALESCE(MAX(s.number), 0) AS lastExistingSlotNumber, b
FOREACH (i in range(lastExistingSlotNumber+1, lastExistingSlotNumber+50) | CREATE (:Slot {number: i})-[:IN_BOX]->(b))

顺便说一下,如果你不喜欢 FOREACH,你可以这样做:

OPTIONAL MATCH (b:Box) WITH COALESCE(MAX(b.number), 0)+1 as lastBoxNumber
CREATE (b:Box {number: lastBoxNumber})
WITH b
OPTIONAL MATCH (s:Slot)
WITH COALESCE(MAX(s.number), 0) AS lastExistingSlotNumber, b
WITH range(lastExistingSlotNumber+1, lastExistingSlotNumber+50) as newNumbers, b
UNWIND newNumbers as newNumber
WITH newNumber, b
CREATE (:Slot {number: newNumber})-[:IN_BOX]->(b)