728x90
반응형

계속 적을 글

  • 본 글은 계속해서 적어갈 예정

Create

  • 메서드 설명
    • CREATE: 동일한 내용의 노드가 있더라도 생성함
    • MERGE: 동일한 노드가 있다면 무시하고 진행함
  • 쿼리 문에 들어갈 파라미터들은 Prepared 하게 런타임에서 주입
    • Golang에서는 map 에 담아서 사용
CREATE 
(p:Person {name: $name, age: $age, languages: $languages})-[l:LIKES]->(t:Technology {name: $tech})

MERGE 
(p:Person {name: $name, age: $age, languages: $languages})-[l:LIKES]->(t:Technology {name: $tech})

// 각각 노드 생성하고 관계 추가
MERGE (a:Person {name: $name})
MERGE (b:Person {name: $friend})
MERGE (a)-[friendship:KNOWS {since: $friendsSince}]->(b)

// Golang
queryArguments := map[string]interface{}{
    "name": name,
    "age": age,
    "languages": languageList,
    "tech": techName,
}

queryErr := dbCon.Insert(CreatePersonQuery, queryArguments)

Select(Match)

  • ExecuteQuery 로 쿼리 수행하고, 나온 데이터를 핸들링한다.
    • []*db.Record 타입으로 리턴됨
내가 핸들링한 방법
  • dbtype.node 의 Props로 감싸고, 키 값으로 처리
  • 공식문서는 AsMap()으로 처리
// ============== 내가 한 방식 ==============
for _, record := range result {
    person, isPersonExist := record.Get("p")

    if !isPersonExist {
        log.Printf("[SINGLE_PERSON] No Person Data Found: %v", isPersonExist)
        continue
    }

    log.Printf("[SINGLE_PERSON] Get single person: %v", person)

    personProperties := person.(dbtype.Node).Props

    personData := Person{
        Name: personProperties["name"].(string),
        Age: personProperties["age"].(string),
        Languages: personProperties["languages"].([]string),
    }

    personList = append(personList, personData)
}

// ============== 공식문서 ==============
 if employeesN := org.AsMap()["employeesN"].(int64);
       employeesN < employeeThreshold {
        err = addPersonToOrganization(ctx, tx, name, orgId)

        if err != nil {
            return nil, err
            // Transaction will roll back
            // -> not even Person is created!
        }
    }
728x90
반응형

'백엔드 Backend > Golang' 카테고리의 다른 글

[gRPC] Go 언어로 gRPC 사용해보기  (2) 2024.12.24
[Neo4J] 데이터 핸들링하기  (1) 2024.12.09
[Neo4j] Golang으로 Neo4j 연동  (0) 2024.12.05
[GO] Ubuntu 서버에 설치  (1) 2024.10.30
[GO] Goroutine이란?  (0) 2024.10.02
728x90
반응형

공식 문서

Golang으로 연결

  • neo4j 드라이버 설치
    • 연결의 인증은 여러 방식이 있음; BasicAuth, BearerAuth, AuthToken, CustomAuth, ...
    • 본 예시는 유저 이름과 패스워드로 인증하는 방식
go get -u github.com/neo4j/neo4j-go-driver/v5/neo4j
  • 드라이버 인스턴스 생성
import (
    "github.com/neo4j/neo4j-go-driver/v5/neo4j"
    "github.com/neo4j/neo4j-go-driver/v5/neo4j/db"
)

func main() {
    driver, err := neo4j.NewDriverWithContext(
        "neoj4://<DATABASE_URI>:<DATABASE_PORT>,
        neo4j.BasicAuth(<USER>, <PASSWD>, ""),
    )
}
  • 연결 체크
import (
    "context"

    "github.com/neo4j/neo4j-go-driver/v5/neo4j"
    "github.com/neo4j/neo4j-go-driver/v5/neo4j/db"
)

func main() {
    driver, err := neo4j.NewDriverWithContext(
        "neoj4://<DATABASE_URI>:<DATABASE_PORT>,
        neo4j.BasicAuth(<USER>, <PASSWD>, ""),
    )

    ctx := context.Background()

    err := driver.VerifyConnectivity(ctx)

    if err != nil {
        log.Printf("[GRAPH_DB] Check Connection Error: %v", err)
        return err
    }

    defer driver.Close(ctx)

    return nil
}

Golang으로 쿼리

  • 쿼리 실행
    • ExecuteQuery 메서드로 쿼리 실행
import (
    "context"

    "github.com/neo4j/neo4j-go-driver/v5/neo4j"
    "github.com/neo4j/neo4j-go-driver/v5/neo4j/db"
)

func main() {
    driver, err := neo4j.NewDriverWithContext(
        "neoj4://<DATABASE_URI>:<DATABASE_PORT>,
        neo4j.BasicAuth("<USER>", "<PASSWD>", ""),
    )

    ctx := context.Background()

    // 쿼리 실행
    result, queryErr := neo4j.ExecuteQuery(
        ctx, 
        driver, 
        "MERGE (n:Node {name:"$nodeName"})", // Node라는 유니크 노드 생성
        []map[string]interface{ // 파라미터 생성. nodeName에 들어갈 값
            nodeName: "New Node"
        }, 
        neo4j.EagerResultTransformer, // 쿼리 결과 변환
        neo4j.ExecuteQueryWithDatabase("neo4j"),
    )

    if queryErr != nil {
        return nil, queryErr
    }

    defer db.Close(ctx)

    for _, record := range result.Records {
        log.Printf("[GRAPH_DB] Query Result: %v", record.Values...)
    }

    // 쿼리 결과에 대한 요약
    log.Printf("The query `%v` returned %v records in %+v.\n",
        result.Summary.Query().Text(), len(result.Records),
        result.Summary.ResultAvailableAfter())
}
728x90
반응형

'백엔드 Backend > Golang' 카테고리의 다른 글

[gRPC] Go 언어로 gRPC 사용해보기  (2) 2024.12.24
[Neo4J] 데이터 핸들링하기  (1) 2024.12.09
[Neo4j] Golang 으로 쿼리 핸들링  (0) 2024.12.06
[GO] Ubuntu 서버에 설치  (1) 2024.10.30
[GO] Goroutine이란?  (0) 2024.10.02
728x90
반응형

그래프 데이터베이스

  • 그래프 데이터베이스는 노드 Nodes, 관계 Relationships, 프로퍼티 Properties 로 된 데이터를 저장하는 데이터베이스
  • 개념
    • Node: 그래프에서의 개체 Entity
    • Relationship: 노드 간의 관계에 대한 이름
    • Property: Node 및 Relationship에 대한 속성들
  • RDB와 비교 비유
    • Label은 RDB의 테이블
    • Node는 레코드(Row)
    • Property는 필드(Column)
    • Relationship은 관계. 딱히 대응시킬 개념은 없는듯

사용하는 이유

  • 대량의 복잡한 데이터 핸들링에 용이함
  • 기존 RDB에서 JOIN 연산은 비용이 비쌈
  • 그래프 데이터베이스는 JOIN 연산이 없음
    • 관계를 더 유연한 포맷으로 네이티브하게 저장함으로써, 데이터 조회 비용도 낮추고 속도도 더 빠르게 최적화됨

많이 사용하는 GraphDB

728x90
반응형
728x90
반응형
  • Neo4j Community Edition
    • 가장 많이 쓰이는 그래프 데이터베이스
    • Cypher라는 쿼리 언어 사용
    • 주로 관계 탐색, 소셜 네트워크 분석, 온톨로지 관리에 사용됨
  • ArangoDB Community Edition
    • 다중 모델 데이터베이스
    • 그래프, 문서, 키-값 데이터 모두 관리 가능.
    • AQL (ArangoDB Query Language) 사용하여 그래프 쿼리 실행
    • 복잡한 관계 데이터 모델링, 온톨로지 관리, 문서형 데이터 통합
  • JanusGraph
    • 유연한 그래프 쿼리 작성 가능.
    • 분산형 아케틱처 지원하여 대규모 데이터에서도 효율적
    • Apache TinkerPop의 Gremlin 쿼리 언어를 사용
    • Cassandra, HBase, ScyllaDB 같은 분산 데이터베이스 및 Elasticsearch, Solr 등의 검색 엔진 지원
    • 대규모 그래프 데이터 처리, 소셜 네트워크, 지식 그래프, 온톨로지 관리
  • OrientDB Community Edition
    • 그래프와 문서형 데이터베이스가 결합된 멀티 데이터베이스
    • SQL과 유사한 쿼리 언어 제공
    • 관계형 데이터베이스와 그래프 데이터베이스의 혼합 사용
    • 데이터 분석 및 온톨로지 관리
  • Apache TinkerPop과 Gremlin Server
    • 그래프 프로세싱을 위한 프레임워크로 다양한 DBMS와 함께 사용
    • Gremlin은 복잡한 그래프 탐색에 유용한 쿼리 언어
    • 다양한 그래프 데이터베이스와 연동 가능
    • 그래프 분석, 온톨로지와 지식 그래프 구축
728x90
반응형

+ Recent posts