我会建议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子句中实施某些限制。下面的查询,似乎只是在有条件的地方(也许一个错误?)跳虽然在我的Cypher支架的理解应当符合现有的组,但它确实创造NEW 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
我目前在做两种查询方法。您的第一个和第三个查询都会创建该组(如您所指出的那样)。不确定在评估哪里之前创建独特的尝试来创建整个路径?只是一个疯狂的猜测:-) – Luanne