2016-07-06 3 views
2

はここに私のモデルのget: (:A)<--(:B)<-[:R {timestamp}]-(:C {number})サイファー - 最新のノード

私は1つのCYPHERクエリで実現しようとしている何が最新R.timestamp(またはC.numberによると、最新のCノードを取得することです)を、与えられたAノードおよびすべてのBノードに対して行う。それは最高のR.timestampを持つ各Bに関連する1つのA、複数のBsおよび1つのCを返す。また、Cノードに関係なくBノードを返すのが最も良いでしょう。

SQLでは、グループごとにn行だけを返すようにグループ化しますが、COLLECTまたはUNWINDで十分な経験はありません同じ結果を達成する。

答えて

3

最初にaノードを見つけて、bノードとcノードでオプションで一致させます。これにより、aとの関係を持たないノードbも見つかります。

MATCH (a:A) 
WHERE a.name = {name} 
OPTIONAL MATCH (c:C)-[:R]->(b:B)-[:R]->(a) 
WITH a, b, c 
ORDER BY c.number 
WITH a, b, last(collect(c)) AS most_recent_c 
RETURN a, b, most_recent_c; 
+0

ありがとう、それはそれを解決します。私は 'last()'関数を見つけませんでした。あるいは、順序(DESCまたはASC)に沿って演奏し、 'head()'で 'last()を切り替えることも可能です。 (c.f. https://neo4j.com/docs/developer-manual/current/#query-function)。 これで、CノードがないBノードは返されません。私は結果を調査し、ここに掲載します。 – Rwanou

+1

私はリレーションプロパティのフィルタリングとデッドエンドBsの両方を扱うことができます: 'MATCH(a:A {名前:{param}})< - (b:B) a、b a、b、r、cを含む ORDER BY r.end DESC WITH a、b、head(collect(c:C) )))as most_recent_c、head(collect(r))as most_recent_r リターンa、b、most_recent_c、most_recent_r; – Rwanou

関連する問題