6

リレーションシップ プロパティの合計によってサイファー クエリを制限する方法はありますか?

開始ノードから 100 以内の距離にあるノードを返すサイファー クエリを作成しようとしています。すべての関係には距離が設定されており、パス内のすべての距離の合計が開始ノードからの合計距離になります。

WHERE 句が集計関数を処理できる場合、私が探しているのは次のようになります

START n=node(1)
MATCH path = n-[rel:street*]-x
WHERE SUM( rel.distance ) < 100
RETURN x

where句のパスにある関係の距離を合計する方法はありますか?

4

3 に答える 3

1

私は最近同じ問題に遭遇しました。最近のバージョンの neo4j では、これはextract句とreduce句によって解決されました。あなたは書くことができます:

START n=node(1)
MATCH path = (n)-[rel:street*..100]-(x)
WITH extract(x in rel | x.distance) as distances, x
WITH reduce(res = 0, x in rs | res + x) as distance, x
WHERE distance <100
RETURN x
于 2016-06-29T08:36:11.217 に答える
1

確かに、あなたがしたいことは、SQL クエリの中にあるようなものです。

cypher では、 を使用してクエリ セグメントをチェーンし、前の部分の結果を次の部分で使用できます。マニュアルWITHを参照してください。

あなたの例では、次のように仮定します。

START n=node(1)
MATCH n-[rel:street*]-x
WITH SUM(rel.distance) as distance
WHERE distance < 100
RETURN x

残念ながら、合計はまだコレクションでは機能しません

だから私はそれを別の方法でやろうとしました(可変長パスの場合):

START n=node(1)
MATCH n-[rel:street*]-x
WITH collect(rel.distance) as distances
WITH head(distances) + head(tail(distances)) + head(tail(tail(distances))) as distance
WHERE distance < 100
RETURN x

残念ながら、空のリストの先頭は、dnullできる可能性のあるものを返しませんが、失敗します。したがって、このアプローチは固定長のパスでのみ機能します。それが機能しているかどうかはわかりません。coalesce0

于 2012-09-18T21:10:24.230 に答える
-1

WHERE 句の制限についてはわかりませんが、MATCH 句で簡単に指定できます。

START n=node(1)
MATCH path = n-[rel:street*..100]-x
RETURN x

http://docs.neo4j.org/chunked/milestone/query-match.html#match-variable-length-relationshipsを参照

于 2012-09-17T13:40:08.110 に答える