2016-05-04 6 views
0

私は、各Personに年齢プロパティがあり、娘の息子である2番目のすべての子を照会したいという画像(1)年齢> 50)である。与えられたデータベーススキームの場合、Bobから始まる私の期待される結果は[Tim、Sam]です。キッパーの複数のリレーションからなるマッチ再帰パターン

enter image description here

私はすでに様々な長さの関係を照会するための「*」演算子を試みたが、それは今のところ動作させることができませんでした。私はボブとティムを返し

START bob=node(0) MATCH (bob)-[:daughter*]->(p:Person)-[:son*]->(s) 
WHERE p.age > 50 RETURN bob, sbob, s 

だけでなく、私に与え

MATCH (:Person)-[:daughter*]->(p:Person)-[:son*]->(s) 
WHERE p.age > 50 RETURN collect(s) 

[ティム、ボブ、トム、サム]を試してみました。

データベース構造を変更せずに期待どおりの結果を得る方法はありますか?空のコレクションが返されるすなわちティナは48で、カルメンが52であれば(事実上不可能ながら)パス上のすべてのdaugthersが50歳以上である必要があり、余分な要件として

更新 、(息子の年齢がドン」 t問題)。

答えて

0
// 
// Find daughters with age > 50 
MATCH (bob:Person {name:'Bob'}), path = (bob)-[:son|daughter*]->(d:Person) 
    WHERE type(last(relationships(path))) = 'daughter' and d.age>50 
// 
// Check if all daughters at path over age 50 
WITH d, nodes(path) as nodes, relationships(path) as rels, 
    range(0, length(path)-1) as index 
    WHERE none(i in index 
       WHERE type(rels[i]) = 'daughter' AND 
         nodes[i+1]['age'] <= 50 
     )  
// 
// Find sons of daughter 
MATCH (d)-[:son]->(s:Person) 
RETURN collect(s) 
+0

これは、子供が両親より若いと仮定すると、私の質問を解決します。実際には不可能だが、私はこの仮定を私の質問で省略したい。更新された質問をご覧ください。 – tNewhomes

+0

N/p - アップデートを参照してください:) –

+0

クエリの実行neo4j 2.2.3を使用してageプロパティにアクセスすると、型が一致しません。私はこれを回避するために、 'extract'を使ってパス内のすべてのノードの年齢を持つコレクションを取得することができました。ご助力ありがとうございます – tNewhomes