2017-07-31 13 views
4

で私はのNeo4j CYPHERは後でクエリ

私は -[:NEXT]->関係の方向から生じる自然順序付けが注文した結果が欲しい
MATCH p=((:Start)-[:NEXT*..100]->(n)) 
WHERE ALL(node IN nodes(p) WHERE ...) 
WITH DISTINCT n WHERE (n:RELEVANT) 
... 
RETURN n.someprop; 

のようなクエリを使用していますため、パスによって課さ注文ください。 しかし、3行目のWITHはその順序をスクランブルします。問題は、私は:RELEVANTノードをフィルタリングし、2.そのようなノードだけを得ることです。

注文を保存する方法はありますか?パス上で番号の順序を割り当て、後でORDER BYと再利用することはできますか?どのようにそれを行うか分かりません。

答えて

2

:たぶんWHEREが問題を引き起こしている...この何かを試してみてください開始ノード。

DISTINCTを使用する代わりに、それぞれnのパス長にmin()(またはお客様の要件に応じてmax())を使用する必要があります。これらは集計関数なので、nごとに1行しか取得できません。

MATCH p=((:Start)-[:NEXT*..100]->(n:RELEVANT)) 
WHERE ALL(node IN nodes(p) WHERE ...) 
WITH n, min(length(p)) as distance 
WITH n 
ORDER BY distance 
... 
RETURN n.someprop; 
+0

ありがとう!私はそれを 'max(length(filter)mnode IN nodes(p)WHERE(mnode:RELEVANT)))')のように拡張しなければなりませんでした。 – tscherg

1

そして、あなたはWITHからWHERE句を削除し、MATCHにラベル:RELEVANTを置けば?あなたは、ノードが複数の経路で到達可能であるかもしれないので、から複数の距離で存在するかもしれないことを示しており、個別のノードに対して求めている

MATCH p=((:Start)-[:NEXT*..100]->(n:RELEVANT)) 
WHERE ALL(node IN nodes(p) WHERE ...) 
WITH DISTINCT n 
... 
RETURN n.someprop; 
+0

このアプローチの問題は、 ':RELEVANT'ノード間に接続パスがないことです。私は '':RELEVANT''ノードにもマッチする必要があります。その後、関連するものをフィルタリングする必要があります。 – tscherg

+0

@tscherg ':(n)'の代わりに '::RELEVANT'を'(:Start) 'ノードに配置しました。私は答えを編集しました。今は意味をなさない? –

+0

これは可能です!私はいつも ':RELEVANT'ラベルを' n'ノードに入れたとき、 ':RELEVANT'ノードだけのパスがないノードには到達できないという印象を受けました。私は間違っていた、それは可能です!ありがとう! – tscherg