2017-12-28 24 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 : 회사) 여기서 c.Name = "회사 A"는 p를 반환하고, o.amt는 c를 나타내며, – logisima

+0

@ logisima는 작동하지 않습니다. 추가 c. 나는 각자를위한 "amts"를 모으려고 노력하고있다. 그래서 Person의 경우 관계 경로에 두 개의 "amts"가 있으면 집계해야합니다 (이 경우 곱함). 하지만 그것들을 집계 할 수 있다고하더라도. –

답변

0

문자열 값이 아닌 숫자 값을 사용하면 소유권 금액을 쉽게 늘릴 수 있습니다. '50%' 대신 십진 형식 .5이어야합니다.

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 

명심해야 할 일이 있다는 것입니다 :

어쩌면 줄이기 사용 (수레 위해 AMT 값을 변경 한 후)이 같은 시도() 경로의 관계에서 모든 금액을 곱합니다 가변 길이 관계 (우리가 * 사용하는 곳)의 변수는 단일 관계가 아닌 관계의 집합을 참조합니다.

+0

감사합니다 @ InverseFalson, 이상하게 충분합니다. 시행 착오를 거쳐 같은 솔루션에 도달했습니다. 실현 된 %는 잘 처리되지 않으며 또한 감소시키는 유일한 기능입니다. –