2017-12-28 36 views
-2

私はCypher /グラフDBを初めて使いました。私は、トラバースを理解するための例を作成しましたが、それを得ていません。Cypher:グループ化/関係

//Cypher below to create nodes. 
(`0` :Person {id:'74474',Name:"Mr. Dan"}) , 
    (`1` :Company {id:'1234',Name:"Company A"}) , 
    (`2` :Company {id:'1111',Name:"Company B"}) , 
    (`3` :Person {id:'0844',Name:"Mr.X"}) , 
    (`4` :Person {id:'3455',Name:"Mr. Jack"}) , 
    (`5` :Person {id:'748222',Name:"Mr.Y"}) , 
    (`0`)-[:`owns` {amt:'50%'}]->(`1`), 
    (`4`)-[:`owns` {amt:'30%'}]->(`1`), 
    (`2`)-[:`owns` {amt:'20%'}]->(`1`), 
    (`3`)-[:`owns` {amt:'30%'}]->(`2`), 
    (`5`)-[:`owns` {amt:'70%'}]->(`2`) 
// end 

クエリ: MATCH(P:人) - [O:所有している*] - >(C:会社) どこc.Name = "A社" リターンP、O //

これは私に "会社A"を所有するすべての "人"を与えますが、私は各人の "所有権"を得たいと考えています。

関係 "o"の値を抽出または集計することはできません。簡単だと思ったが、私は挑戦されたようだ!

提案がありますか?

+2

私たちのために読みやすいようにコードをフォーマットしてください! – Skam

+0

MATCH(p:Person) - [o:owns *] - >(c:Company)ここで、c.Name = "A社"がpを返します。o、amt、c – logisima

+0

@ logisima-は動作しません。 cを加える。私は各人のために "amts"を集計しようとしています。したがって、Personの場合、関係パスに2つの "amts"がある場合は、集計する必要があります(この場合は乗算する必要があります)。しかし、私はそれらを集めることができる場合でも、それはスタートです。 –

答えて

0

文字列値ではなく数値を使用すると、1つの所有権金額を乗算する方が簡単になります。彼らは'50%'の代わりに.5という小数形式にする必要があります。

たぶんパスに関係全体のすべての金額を乗算する)(REDUCE使用して、(山車にあなたのAMT値を変更した後に)このような何かを試してみてください。

MATCH (p:Person)-[owns:owns*]->(c:Company) 
WHERE c.Name="Company A" 
RETURN p, reduce(amt = 1, o in owns | amt * o.amt) as percentOwned 

心に留めておくべき事はということです可変長関係(ここでは*を使用する)上の変数は、単一の関係ではなく、関係の集合を参照します。

+0

感謝@InverseFalson、不思議そうなほど。試行錯誤して同じ解決策に達しました。実現された%はうまく処理されず、また機能するのは減少するだけです。 –