2016-10-13 1 views
0

저는 Neo4J Cipher의 새로운 기능입니다. SQL로 가져 오려는 것을 알고 있지만 Cipher에서는 쿼리를 작성할 수 없습니다. SQL 외부 조인 대 Neo4J 암호

는의 3 개 테이블을 보자 :

Pers(persId,name,workId,born) 
Work(workId,name) 
Friend(pers1Id,pers2Id) 

문제 : 같은 회사에서 일을하고없는 친구와 나이 차이가 적은 than5 인 사람을 찾을 수 있습니다. 무엇 Neo4J 암호에 대한

select * from Pers p1 join Pers p2 on p1.workId=p2.workId 
where not exists 
(select 1 from Friend f where p1.persId in (f.person1Id,f.person2Id) 
and p2.persId in (f.person1Id,f.person2Id)) 
and abs(p1.born-p2.born)<5 

: SQL에서 는 간단한 쿼리는 다음과 같습니다? 특히 SQL을 Cipher 쿼리로 변환하는 방법에 대한 도움을 주시면 감사하겠습니다. 미렉

+0

가 그렇게 시도했다 포함 멀리, 그것이 작동하지 않는 경우에도 – InverseFalcon

답변

0

Person : 및 Workplace 레이블이 있다고 가정 해 보겠습니다. 의 관계 이러한 종류의 가정하자 이미 존재 :

(:Person)-[:WorksAt]->(:Workplace) 
(:Person)-[:FriendsWith]->(:Person) 

귀하의 사이퍼 쿼리 같이 보일 것입니다 :

MATCH (p1:Person)-[:WorksAt]->()<-[:WorksAt]-(p2:Person) 
WHERE NOT (p1)-[:FriendsWith]-(p2) 
AND abs(p1.born-p2.born) < 5 
RETURN p1, p2 

비록 순서가 전환과 내가 (당신이 페어링 당 두 개의 행을 얻을 것이다 생각 염두에 두어야 우리는 당신이 필요하면 큰 어려움없이 그것을 제거 할 수 있습니다).

일반적으로 패턴 또는 쿼리의 다이어그램을 그리는 것이 좋습니다. 일반적으로이를 Cypher로 변환하는 것은 그리 어렵지 않습니다.

0

InverseFalcon의 대답에서 알 수 있듯이 WHERE NOT <pattern> 구문을 사용하여 안티 조인 (anti-semijoin이라고도 함) 연산을 표현할 수 있습니다.

난 그냥 주제에 학술 논문을 완성 - 용지가 피어 리뷰에서 현재이지만, 당신이 관계 대수와 사이퍼 사이의 연결을 이해하는 데 도움이 : 그것은 도움이 http://docs.inf.mit.bme.hu/ingraph/pub/btw2017-opencypher.pdf