3

次の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がnullになる場合があります(つまり、IDがgroupIdのグループが存在しない)。このような場合、このステートメントでユニットを作成し、has_groupとgの関係をスキップするにはどうすればよいですか?現在、おそらくgがnullであるため、ユニットは作成されません。

Neo4jAdvanced1.8を使用しています

ありがとう!

4

4 に答える 4

1

g の定義を where 句に移動することをお勧めします。存在しないノードから開始するとエラーが発生し、クエリを作成フェーズに続行できないためです。「?」に注意してください。Cypher で null 値を処理します。

 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

グループが存在しない場合、2 番目のクエリはエラーで失敗しますが、それでもターゲットに到達するので問題ありません。なんらかの奇妙な理由で、最初のショットで試したように、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
于 2012-11-06T15:24:02.037 に答える
0

WITH 句を使用して、1 つのクエリでこれを実現できます。

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 の場合、秒はまったく実行されません。ここでは WHERE g <> null でさえ必要ないかもしれません。確認してみてください

于 2012-11-07T17:50:14.383 に答える