Clean Code that Works.

http://java.dzone.com/articles/modelling-data-neo4j?mz=36885-nosql

위 아티클 맘대로 번역.


관계형 데이터베이스 세계에서 아름다운 그래프의 세계로 전환하기 위해서는 데이터에 대한 생각의 변화가 필요하다. 
그래프는 종종 테이블보다 더 직관적이긴 하지만 처음으로 그래프로 모델링을 할려고 할때 생기는 몇가지 문제 점이 있다. 
이 아티클에서 혼동되는 한가지 상황를 살펴 본다(양방향 관계)


단방향 관계

Neo4j 에서 관계는 반드시 타입을 가져야 하고 관계에 의미를 부여 해야 하고 방향성이 있어야 한다. 
방향은 자주 관계가 의미하는 것의 일부분이 된다. 즉 관계는 방향성이 없으면 모호하게 된다.
예를 들어 아래 그래프는 아이스하키에서 Czech Republic 팀이 Sweden 을 DEFEATED했다는것을 보여준다. 
방향성이 없으면 이 관계는 모호하게 되고, 누가 승리자가되는지 알수가 없게 된다.



아래 그래프 그림 처럼 관계가 존재 하는것은 반대관계가 있다는 것을 의미한다.
이는 흔한 경우로 다른 예를 들어보면 펄프픽션은 쿠엔틴 타란티노에 의해 DIRECTED_BY 됬고 쿠엔틴 타란티노는  펄프픽션의 IS_DIRECTOR_OF 관계도 된다.
관계들이 모두 짝을 이루고 있기 때문에 관계의 수가 매우 늘어날 수 있다.


Neo4j로 도메인을 모델링할때 발생하는 가장 흔한 실수중에 하나는 짝을 이루는 관계 두개를 만드는 것이다. 
한 관계는 다른 관계도 의미하기 때문에 이것은 공간과 탐색 시간 면에서 낭비적이다.
Neo4j는 양방향의 관계에 대해 탐색이 가능하다.
조금 더 중요것은 Neo4j가 데이터를 구성하는 방법에 때문에 탐색의 스피드는 관계의 방향에 의존 하지 않는다.


양방향 관계

다른 한편으로 어떤 관계들은 페이스북이나 실제 현실에서 친구들 처럼 자연적으로 양방향성을 가지고 있다.
우리가 모델을 어떻게 보느냐에 따라 달려있지만 방향성이 없다고도 말할 수 있다.

아래 그림을 보면 GraphAware와 Neo technology는 파트너 회사들이다. 이 상호 관계이기 때문에 우리는 양방형성과 방향성이 없는 관계로 각기 정의 할 수 있다. 


하지만 이중에 Neo4j에서 직접적 정의가 가능한게 없기 때문에 초보자들은 가끔 아이스 하키 모델 잘못된 동일한 문제를 겪고 불필요한 관계를 가진 모델을 생성한다.


Neo4j API는 만약 개발자가 원한다면 쿼리로 그래프를 사용할때 완벽하게 방향성을 무시하고 사용할 수 있도록 허락한다. 예를 들어 Neo4j는 자신만의 Cypher라는 자신만의 쿼리 언어를 가지고 있다. Neo Technology 와 파트너 회사를 조회하는 쿼리는 아래와 같다.

MATCH (neo)-[:PARTNER]-(partner)

이 결과는 아래 두 쿼리의 결과를 합한것과 동일하다.

MATCH (neo)-[:PARTNER]->(partner)
or
MATCH (neo)<-[:PARTNER]-(partner)


따라서 파트너 관계를 정의하는 정확한 방법(혹은 가장 효과적인)은 하나의 PARTNER 관계를 임의의 방향으로 설정 하는것이다.

결론


Neo4j에서의 관계는 동일한 속도로 양방향 탐색이 가능하다. 게다가 방향성은 완벽하게 무시하고 사용 가능하다. 
따라서 만약 하나가 다른것을 의미하는 경우 노드들 사이에 두개의 서로 다른 관계를 만들 필요가 없다.