2013-11-09 2 views
0

neo4j 1.9.2를 사용하여 그래프에서 다른 노드와 일대일 관계가있는 모든 노드를 찾으려고합니다. 그래프에 사람이 있고 2013 년 이후로 정확히 한 명의 친구가있는 모든 사람을 찾고 싶다고 가정 해 보겠습니다.이 친구는 다른 사람이 친구이고 그 외에는 다른 사람이 없습니다. 돌아가서, 나는이 모든 "고립 된"친구들을 원합니다. Neo4j - Cypher가 1 대 1의 관계를 반환합니다.

나는 시도 다음

START n=node(*) MATCH n-[r:is_friend]-m-[s:is_friend]-n 
WHERE r.since >= 2013 and s.since >= 2013 
WITH n, m, count(r), count(s) 
WHERE count(r) = 1 AND count(s) = 1 
RETURN n, m 

그러나이 쿼리가 어떻게해야 무슨하지 않습니다 - 단순히 아무것도 반환하지 않습니다.

참고 : 두 사람 사이에 단 하나의 관계 만 존재합니다. 따라서 한 친구에게는 들어오는 관계가 있고 다른 한 사람에게는 나가는 관계가 있습니다. 또한이 두 사람은 "works_in"과 같은 다른 관계를 가질 수도 있지만 그 사람 사이에 * is_friends * 유형의 1 : 1 관계가 있는지 확인하려고합니다.

편집 : 노드 (*)를 시작점으로 사용하면 Stefan의 제안이 완벽하게 작동합니다. 그러나 하나의 특정 노드에 대해이 쿼리를 시작 지점 (예 : start n = node (42))으로 사용하면 작동하지 않습니다. 이 경우 솔루션은 어떻게 생겼을까요?

업데이트 : 나는이 szenario에 대한 해결책에 대해 궁금해하고 있습니다. 어떤 아이디어?

답변

3

MATCH 절에서 경로 개념을 이해하는 것이 중요합니다. 경로는 노드, 관계, 노드, 관계, .... 노드의 교대 모음입니다. 동일한 관계가 같은 경로에서 두 번 절대 발생하지 않을 것이라는 제약이 있습니다. 그렇지 않으면 무한 루프가 발생할 위험이 있습니다.

그렇다면 도메인에서 is_friend의 방향을 결정해야합니다. 지시를 받으면 친구가되는 것을 구별하고 친구는 b로 구별합니다. 설명에서 나는 is_friend이 방향성 가정 및처럼 문이 보일 것입니다 : 당신이 node(*)을하기 때문에 당신은, 그것은 그럼에도 불구하고 통과있어 다른 쪽 끝을 걱정하지 않아도

START n=node(*) MATCH n-[r:is_friend]-() 
WHERE r.since >= 2013 
WITH n, count(r) as numberOfFriends 
WHERE numberOfFriends=1 
RETURN n 

. 그래프가 커지면 node(*)은 분명히 더 비쌉니다.

+0

좋습니다. 노드 (*)에서 시작하면 제안이 정상적으로 작동합니다. 하지만 단일 시작 노드에서 시작할 때 어떻게해야합니까? 그런 다음 친구가 단 한 명의 친구 만 가지고 있다는 제약 조건은 확인되지 않습니다. 솔직히 말해서, 내가 실제로하는 일은 그래프의 하위 집합에서 시작하는 것입니다. 하지만 여전히이 경우 귀하의 제안은 전체 그래프에서 내가 고립 된 모든 친구를 반환하지 않습니다 – user2752625

+0

제 편집은 어떻게됩니까? 하나의 특정 시작 노드에서 시작할 때,이 시작 노드에 단 하나의 친구가 있는지 어떻게 확인할 수 있습니까?이 경우,이 친구는 시작 노드 만 친구로 만들고 두 노드 모두를 반환합니다. 그 시나리오에 대한 제안? – user2752625

+0

선택 사항 인'match'를 사용할 수 있습니다 :'MATCH n- [r? : is_friend] -()','r' 다음에 물음표를 적어주세요. –

관련 문제