사용자 영향력 프로젝트

[트위터] 데이터베이스 코드

appendonly 2022. 12. 19.

 

Neo4j 특징

그래프 데이터를 저장 및 관리하는 그래프 DB이다.

1. 자바 기반의 그래프 DB이며 임베딩 방식과 REST 방식을 지원

2. 트랜잭션을 지원하며 JTA를 지원

3. 인덱스 및 노드 탐색을 지원

4. 이중화를 통한 고가용성을 지원

5. 백업 및 복구를 지원

6. 다양한 그래프 알고리즘을 지원

7. 관계 데이터베이스는 엄격한 스키마를 따라야 하며 JOIN 연산이 필요한 반면, Neo4j는 JOIN이 없고 모든 데이터는 Node와 Relation으로 표현되며 탐색에 최적화

8. Node에는 Label이 존재하며 

9. 집계 연산에 취약하다.

10. Label(Table)은 노드 분류 방법으로 하위 그래프를 신속하고 효율적으로 작성 가능. 노드 당 레이블 여러개 설정 가능한 반면, 관계는 하나의 레이블만 지정 가능. Property(Column)는 노드의 속성을 key:value로 나타낸다. 관계는 Foreign Key 및 JOIN이랑 유사하다.

11. 질의어는 Cipher를 쓰며 이는 선언형 질의 방식을 쓴다.

https://seamless.tistory.com/45

https://jehwanyoo.net/2020/10/02/%EB%AA%85%EB%A0%B9%ED%98%95-%EC%96%B8%EC%96%B4%EC%99%80-%EC%84%A0%EC%96%B8%ED%98%95-%EC%96%B8%EC%96%B4%EC%9D%98-%EC%B0%A8%EC%9D%B4/

12. index-free adjacency

(https://frhyme.github.io/others/index_free_adjancency/#:~:text=index%2Dfree%20adjacency%EB%8A%94%20%EB%85%B8%EB%93%9C,%EB%B9%A0%EB%A5%B8%20%EA%B2%80%EC%83%89%EC%9D%B4%20%EA%B0%80%EB%8A%A5%ED%95%B4%EC%A7%84%EB%8B%A4.)

 

Neo4j Desktop를 사용했으며 자바 코드에서는 org.neo4j.driver(JDBC X)를 사용함.

세션을 만들고 세션 객체의 writeTransaction 함수 안에 익명 객체로 TransactionWork를 입력하면 트랜잭션 내 쿼리들이 실행됨. 아래가 그 예시이다. 이때 TW의 execute 함수를 오버라이드 한다.

 

Python에서는 networkx의 DiGraph 클래스로 그래프를 구축함.

 

쿼리 결과는 위 패키지의 Result 클래스로 받아야 한다.

 

노드나 관계를 생성할 때 이미 존재하는 경우 추가로 넣지 않도록 INSERT 대신 MERGE를 사용함.

try( Session session = driver.session() )
{
    String transaction = session.writeTransaction( new TransactionWork<String>() {
        @Override
        public String execute( Transaction tx )
        {
            Result result = tx.run("쿼리",
                    parameters("바인딩변수1", 변수값, "바인딩변수2", Integer.parseInt(m)));

            try {
                return String.valueOf(result.single().get(0));
            }catch(Exception e) {return null;}
        }
    });

    return transaction.equals("TRUE");
}catch(Exception e) {return false;}

 

1. boolean checkRel(final String m, final String s)

String greeting = session.writeTransaction( new TransactionWork<String>() {
    @Override
    public String execute( Transaction tx )
    {
        Result result = tx.run("MATCH  (a:Node {id: $s}), (b:Node {id: $m}) RETURN EXISTS( (a)-[:FOLLOWS]->(b) )",
                parameters("s", Integer.parseInt(s), "m", Integer.parseInt(m)));

        try {
            return String.valueOf(result.single().get(0));
        }catch(Exception e) {return null;}
    }
});

return greeting.equals("TRUE");

두 사용자 간 관계 유무를 확인한다.

 

2. void insertNode(final String id, final String t_id)

public String execute( Transaction tx )
{
    Result result = tx.run( "MERGE (n:Node {id:$id}) " +
                                     "SET n.t_id = $t_id " +
                                     "RETURN n.id + ', from node ' + id(n)",
            //parameters("id", Integer.parseInt(id), "t_id", Integer.parseInt(t_id)));
            parameters("id", id, "t_id", t_id));//09-26 Integer.parseInt(id) -> id
    return result.single().get( 0 ).asString();
}

그래프에 새로운 노드를 삽입한다.

 

3. void createRel(final String m, final String s)

public String execute( Transaction tx )
{
    Result result = tx.run( "MATCH (a:Node {id:$s}) MATCH (b:Node {id:$m}) MERGE (a)-[:FOLLOWS]->(b)", 
    				parameters("s", s, "m", m) );
    return s+"->"+m+" inserted.";
}

그 외 그래프 노드 수, 노드 존재 여부 등 기본적인 함수들이 포함되어 있다.

'사용자 영향력 프로젝트' 카테고리의 다른 글

[트위터] 토픽 할당 (사용자)  (0) 2022.12.20
[트위터] Main 함수 코드  (0) 2022.12.19
[트위터] 데이터 수집기  (0) 2022.12.17

댓글