我建议将 g 的定义移至 where 子句,因为从不存在的节点开始会出错,因此无法将查询继续到创建阶段。注意“?” 处理 Cypher 中的空值:
start n=node:types(id={typeId})
create unique (n)<-[:has_type]-(unit {props})-[:has_group]->(g)
where g.id?={groupId}
return unit
查询可能需要一些调整,这只是我的第一个未经测试的镜头。
编辑:经过一番尝试,我得出一个结论,您可能想要做 2 个不同的查询,首先是创建与始终存在的唯一节点的关系的第一部分,第二部分是创建与可能不会发生的组的关系:
start n=node:types(id={typeId})
create unique (n)<-[:has_type]-(unit {props})
return unit
start unit=node:unitProps({unitPropsValue}) ,g=node:groups(id={groupId})
create unique unit-[:has_group]->g
return g
如果组不存在,第二个查询将失败并出现错误,但这并不重要,因为您仍然会到达目标。出于某种奇怪的原因,我无法像第一次尝试那样在 where 子句中实施一些限制。以下查询似乎只是跳过了 where 条件(可能是错误?),尽管在我对 Cypher 的理解中,它应该与已经存在的组匹配,但它确实创建了一个新的 g 节点:
start n=node(1)
create unique n-[:TYPE1]-(uniq {uid:333})
with uniq
create unique uniq-[:TYPE2]->g
where has(g.gid) and g.gid=999
return g