Modeling Data in Neo4j: Qualifying Relationships
http://java.dzone.com/articles/modelling-data-neo4j-0
이번에도 마음대로 번역!@
내용을 요약하면 노드을의 관계에 대해서 검증(확실하게 아는)된 것이면 노드에 속성을 부여(관계+1속성)을 사용하는 것 보다, 여러 타입의 관계를 사용 하는것이 read 속도에서 압도적으로 빠르다.
지금 하고있는 생활 코딩 소스를 보면 아래와 같은 관계로 표현하는것이 관계를 여러개 타입으로 사용하는 것이다.
관계에 대한 것을 아래처럼 type으로 정의할 수도 있고, 관계 클래스를 만들어서 정의(클래스에 속성값 사용 가능, 관계 + 속성) 할 수 있다.
@RelatedTo(type = "FRIENDS", direction = Direction.OUTGOING) private Set<leaguesummoner> friends; @RelatedTo(type = "LIKES", direction = Direction.OUTGOING) private Set<leaguesummoner> likes; @RelatedTo(type = "INTEREST", direction = Direction.OUTGOING) private Set<leaguesummoner> interest; @RelatedTo(type = "TROLL", direction = Direction.OUTGOING) private Set<leaguesummoner> trolls;
아래부터 번역 시작.
Java로 작성된 샘플 코드는 Neo4J Java API를 사용한 것이고, Cypher(사이퍼)로 작성된 것은 Neo4j에서 제공하는 Cypher Query Language로 된 것이다.(SQL 처럼)
=======================================================================================
'초보자를 위한 Neo4j 모델링' 시리즈의 이전 포스트에서 양방향성 관계에 대해 살펴보았다. 이 포스트에서는 다른 타입의 여러 관계와 관계에 속성을 사용하는 방법에 대해 비교해 보도록 하겠다.
검증을 위한 속성(Properties as Qualifiers)
Neo4j에서 영화에 대한 평점을 매기는 모델링에 대해 이야기해보자. 사람들은 1~5까지 평점을 매길수 있고 이것을 모델링 하는 처음으로 생각한 방법은 'RATED' 라는 관계를 생성하고 1~5사이의 값을 가지고 있는 rating이라는 속성을 만드는 것이다.
Java 와 Cypher을 사용하여 이 모델에 대한 쿼리를 만드는것은 간단하다. 펄프 픽션에 대한 긍정적인 평가들을 구할려면 아래와 같이 rating이 3이상인 것을 구하면 된다.
1.
for
(Relationship r : pulpFiction.getRelationships(INCOMING, RATED)) {
2.
if
((
int
) r.getProperty(
"rating"
) >
3
) {
3.
Node fan = r.getStartNode();
//do something with it
4.
}
5.
}
동일하게 사이퍼에서는 아래와 같이 하면 된다.
1.
START pulpFiction=node({id})
2.
MATCH (pulpFiction)<-[r:RATED]-(fan)
3.
WHERE
r.rating > 3
4.
RETURN
fan
다양한 관계들
우리는 가능한 관계들에 대해서 다 알고 있기 때문에 각각 평점에 대해 다른 관계를 설정하는 방법을 생각할 수도 있다.
예를 들어 1~5까지의 평점에 따라 LOVED, LIKED, NEUTRAL, DISLIKED, HATED의 관계를 만들 수 있다.
이 관계를 그래프로 표현하면 아래와 같다.
이전에 사용했던 쿼리들은 동일한 결과를 표시하기 위해 약간 수정을 해야 한다. 펄프 픽션의 팬이 누구인지 자바로 표현하면 아래와 같다.
1.
for
(Relationship r : pulpFiction.getRelationships(INCOMING, LIKED, LOVED)) {
2.
Node fan = r.getStartNode();
//do something with it
3.
}
그리고 사이퍼로 표현하면
1.
for
(Relationship r : pulpFiction.getRelationships(INCOMING, LIKED, LOVED)) {
2.
Node fan = r.getStartNode();
//do something with it
3.
}
비교 하기
위 두가지 방법에 대한 쿼리 문법은 크게 다르지 않다.
예를 들어 보면 10가지 다른 관계가 있고 이중에서 7가지를 조회하는 쿼리를 만들 경우 첫번째 방식이 더 효과적이라고 주장할 것이다.
이 방식은 우리가 찾길 원하는 관계 타입에 대해서 전부 입력해서 조회하지 않아도 된다.
하지만 우리는 성능에 관점을 두고 두가지 방법으로 탐색을 해보도록 하자.
첫 번째 실험은 두 가지 방법사이의 쓰기 처리량의 차이가 있는지 알 수 있도록 되어있다.
노드 사이의 1000개의 관계를 생성 하고 이걸 생성하는데 걸리는 시간을 측정했다.
결과는 아래와 같다.
둘 사이의 명확한 쓰기량 차이는 보이지 않지만 탐색을 위한 경우에는 다르게 나온다.
두 번째 실험은, 100개의 노드와 5000개의 무작위 관계를 가지 쿼리를 수행했다.(무슨 말인지 이해가 안되서 아래 원문을 참조 하세요)
In the second experiment, we executed all the queries shown earlier 100 times on a graph with 100 nodes and 5,000 randomly qualified, uniformly distributed relationships (which makes the degree of each node 100, on average).
실험은 아래 3개지 다른 세팅을 가지고 수행하였다.
1. 캐쉬 없이 데이터를 디스크에서 읽는다.
2. 데이터에 대한 로우레벨 캐시만 적용되어 있고, 하이레벨 캐쉬는 중지
3. 데이터에 대한 하이레벨 캐시 적용.
아래 두가지 그림은 각각 Cypher와 Java에서 수행했을때의 결과를 보여준다.
다양한 관계를 생성하는 방법이 항상 단일관계-1개 속성의 방법보다 더 뛰어난 성능을 보여주고 가끔 8배 이상의 성능을 보여준다.
여기에는 Neo4j에서 디스크와 메모리에서의 데이터를 구성하는 방법의 기술적인 이유가 있다. 하지만 이 내용을 여기선 다루지 않고, 다음 글에서 이야기 할예정이다.
Single-hop 탐색 측정을 수행한것이 중요한데 이 결과가 8배 빠른데 관계의 깊이가 2레벨이 되면 64배 빠를수 있고 3레벨이 되면 512배 빠를 수 있다.
결론
가능하면 다양한 관계를 설정하는 방식이 단일관계-1개 속성의 방식보다 월등한 성능을 보여준다. 이 방식은 두번째 방식 보다 항상 최소한 2배 이상 빠르다.
만약 하이레벨 캐쉬를 사용하고 native Java API를 사용하면 다양한 관계를 설정하는 방법이 두번째 방식보다 8배 이상 빠르다.
Neo4j 데이터 모델링 : 양 방향 관계.
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에서의 관계는 동일한 속도로 양방향 탐색이 가능하다. 게다가 방향성은 완벽하게 무시하고 사용 가능하다.
따라서 만약 하나가 다른것을 의미하는 경우 노드들 사이에 두개의 서로 다른 관계를 만들 필요가 없다.
Neo4j 2.0 에 추가되는 기능.
http://blog.neo4j.org/2013/10/neo4j-200-m06-introducing-neo4js-browser.html
브라우저를 통해서 그래프를 탐색 할 수 있게 된다.
1.8 버전에는 neoclipse 를 통해서 했었는데... 1.9버전은 안되더니..
2.0버전 부터는 웹콘솔 자체에 포함해서 해주는듯... 기대 중이다!
근데 그전에.. 간단한 보안관련 로직도 좀 넣어 주면 안되겠니? ..;
MySql 쿼리 참고
Sybase disk size 변경.
name = ‘existingDevice’,
size = ‘additionalM’
Please note, this is to add space to exisiting device. i.e the device is 100M, the following command will make the device 500M
disk resize name = testDev, size = “400M”
Sysbase 덤프 파일 적용
사이베이스 사용중인데
덤프 해 놓은 bcp 파일을 DB로 import 할 때 인코딩 문제가 발생해서..
-_-..
왕짜증 ㅠㅠ
매뉴얼좀 잘 읽어 봅시다.
저기서 -c는 데이터 구분자, -r은 라인 구분자 -J 케릭터셋
-J를 꼭 명시해줄 것.
SELECT TOP 1 in Derby
Sql Server: Select Top 1 * From MyRecs ORDER BY ID DESC
MySql: Select * From MyRecs ORDER BY ID DESC LIMIT 1
but in Derby.. how?
--
Bernt Marius Johnsen, Database Technology Group,
Staff Engineer, Technical Lead Derby/Java DB
Sun Microsystems, Trondheim, Norway
--
He had answered question.
but it will not give you the *last* record inserted (SQL is a set
language!). It will give you the row with the *highest* ID.
What about
select * from MyRecs where ID in (select max(ID) from MyRecs)
What is max function? go link
Original Thread is Here.
Derby show all tables.
Derby 에서 테이블 목록 확인 하는 방법
ij 로 접속 후 show tables;
스키마, 테이블명, 설명
이게 출력된다.
IJ Console view.
Oracle date format
select * from v$nls_parameters;
nls_parameters에 값들 보기
ALTER session set nls_date_format='YYYY-MM-DD HH24:MI:SS:FF3';
ALTER session set nls_timestamp_format='YYYY-MM-DD HH24:MI:SS:FF3';
date 형식 수정하기.