2012-11-06 98 views
3

对于以下的Cypher语句:Neo4j的Cypher支架:创建关系仅在端节点存在

start n=node:types(id={typeId}), g=node:groups(id={groupId}) 
create unique (n)<-[:has_type]-(unit {props})-[:has_group]->(g) 
return unit 

有当g可以为空的情况下(即具有ID的groupId的基团不存在)。 在这种情况下,我应该怎么做才能创建该单元,但跳过与g的has_group关系? 现在,单元不会被创建,大概是因为g为空。

我正在使用Neo4j Advanced 1.8

谢谢!

回答

1

我会建议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 
+0

我目前在做两种查询方法。您的第一个和第三个查询都会创建该组(如您所指出的那样)。不确定在评估哪里之前创建独特的尝试来创建整个路径?只是一个疯狂的猜测:-) – Luanne

0

您可以使用WITH子句在一个查询中实现此功能,

start n=node:types(id={typeId}) 
create unique (n)<-[:has_type]-(unit {props}) 
WITH unit 
START g=node:groups(id={groupId}) 
create unique (unit)-[:has_group]->(g) 
WHERE g <> null 
return unit 

如果g为空,则根本不会执行第二个。甚至在这里可能不需要null <> null。请尝试并确认

+0

这是行不通的,因为你的第二个START试图从一个不存在的节点开始。你会得到一个错误:org.neo4j.graphdb.NotFoundException:Node [50] – Luanne

0

你可以试试这个

MATCH (g:groups) 
    WHERE id(g)={groupId} 
    create unique (unit {props})-[:has_group]->(g) 
    WITH unit, create unique (unit)-[:has_type]->(n) 
    return unit 
0

由于这是我能找到与此相关的,我将添加我如何与此处理,因为没有任何其他答案的唯一的事情是不够好为我的目的。

MATCH (a:TEST{id:1}) 
OPTIONAL MATCH (b:TEST) 
WHERE b.id IN [2,3,5] 
// collect b so that there are no nulls, and rows aren't lost when no match 
WITH a, collect(b) AS c 
FOREACH(n IN c | CREATE UNIQUE (a)-[:HAS]->(n)) 
RETURN a 

将工作的Cypher支架2.3+(我无法测试比任何更早)

对于那些APOC,你也可以用CALL apoc.cypher.doIt()打出来的写。

相关问题