JanusGraph/JanusGraph 실습

JanusGraph 실습 4 / import & export

Severus Moriarty 2025. 4. 18. 22:08

🧩 JanusGraph Import / Export 구조

✅ 설명

  • JanusGraph DB는 외부에서 데이터를 불러오거나 내보낼 때 두 가지 포맷을 지원합니다:
GraphSON JSON 기반 사람과 기계 모두 읽기 쉬운 형식
GraphML XML 기반 W3C에서 정의한 표준 그래프 표현 언어, 도구 간 호환성 높음
  • Import: 외부 JSON(GraphSON) 또는 XML(GraphML) 파일을 JanusGraph에 삽입
  • Export: JanusGraph에 있는 그래프를 JSON 또는 XML 형식으로 내보낼 수 있음

🧩 GraphSON 구조 예시 (JSON 기반)

{
  "id": "2",
  "label": "person",
  "inE": {
    "knows": [
      {
        "id": 7,
        "outV": 1,
        "properties": {
          "weight": 0.5
        }
      }
    ]
  },
  "properties": {
    "name": [{"id": 2, "value": "vadas"}],
    "age":  [{"id": 3, "value": 27}]
  }
}

✅ 왼쪽: 시각화된 그래프 구조

  • 그래프의 노드와 엣지들이 시각적으로 구성되어 있음
  • 예를 들어 marko(id:1)는 josh(id:4)를 knows 관계로 알고 있으며 weight=1.0
    • ✅ 구조 설명
      id 노드 ID (고유값)
      label 노드 타입 (person, software) 등
      inE 들어오는 엣지 정보 (knows, created 등)
      properties 노드에 달린 속성 (name, age 등)

🧩 GraphML 구조 예시 (XML 기반)

<node id="1">
  <data key="labelV">person</data>
  <data key="name">marko</data>
  <data key="age">29</data>
</node>
<node id="2">
  <data key="labelV">person</data>
  <data key="name">vadas</data>
  <data key="age">27</data>
</node>
<edge id="7" source="1" target="2">
  <data key="labelE">knows</data>
  <data key="weight">0.5</data>
</edge>

✅ 왼쪽: 동일한 그래프 시각화

  • 동일하게 marko가 vadas를 knows 관계로 알고 있음
    • ✅ 구조 설명

       

      <node> 노드 정의
      <edge> 엣지 정의 (source, target)
      <data key="..."> 노드/엣지의 속성값 표현

      ✍️ 두 포맷 비교 요약

      항목 GraphSON (JSON) GraphML (XML)
      형식 JSON XML
      장점 가독성 좋고 JSON 기반 API와 연동 쉬움 그래프 표준 포맷으로 호환성이 좋음
      사용처 Gremlin 기반 백엔드에서 주로 사용 시각화 도구 / 외부 시스템과 연동에 적합
      JanusGraph 지원 ✅ Import/Export 모두 가능 ✅ Import/Export 모두 가능

📌 가져오기

GraphSON

graph.io(graphson()).readGraph("data.json")

GraphML

graph.io(graphml()).readGraph("data.xml")

 


📌 내보내기

GraphSON

graph.io(graphson()).writeGraph("exported-graph.json")
  • graphson()은 JSON 기반의 GraphSON 포맷을 의미
  • writeGraph("파일명")은 현재 그래프를 해당 경로에 쓰는 명령

GraphML

graph.io(graphml()).readGraph("data.xml")

 

 

  • graphml()은 XML 기반의 GraphML 포맷
  • .xml 확장자를 주로 사용하며 Gephi, Cytoscape와 같은 도구에서 시각화 가능

 

  • graphml()은 XML 기반의 GraphML 포맷
  • .xml 확장자를 주로 사용하며 Gephi, Cytoscape와 같은 도구에서 시각화 가능

✅ 테스트할 Groovy 스크립트 (예시: load-graph.groovy)

graph = TinkerGraph.open()
graph.io(graphml()).readGraph('tinkerpop-modern.xml')
g = graph.traversal()

println()
println("::: 데이터 삽입 완료 :::")
println("정점 수: " + g.V().count().next())
println("엣지 수: " + g.E().count().next())
println()

🔍 1. -e 옵션: 실행 후 바로 종료

./bin/gremlin.sh -e load-graph.groovy

📄 출력 결과:

::: 데이터 삽입 완료 :::
정점 수: 6
엣지 수: 6
 
  • 스크립트만 실행하고 Gremlin Console은 자동 종료
  • 더 이상 g.V() 같은 쿼리를 이어서 입력할 수 없음
  • 결과만 빠르게 확인할 때 적합

🔍 2. -i 옵션: 실행 후 콘솔 유지

./bin/gremlin.sh -i load-graph.groovy

📄 출력 결과:

::: 데이터 삽입 완료 :::
정점 수: 6
엣지 수: 6

gremlin> g.V().valueMap()
==>[name:[marko], age:[29]]
==>[name:[vadas], age:[27]]
==>[name:[lop], lang:[java]]
...
  • 스크립트가 실행된 뒤, Gremlin Console이 유지됨
  • g, graph 변수 등 스크립트 내 객체들을 계속 사용할 수 있음
  • 이후 쿼리 실습 가능: g.V().hasLabel('person'), g.E().toList() 등

✅ 결과 비교 요약표

항목 -e 옵션 -i 옵션
실행 결과 출력 O O
콘솔 유지 ❌ 종료됨 ✅ 유지됨
이어서 쿼리 가능 ❌ 안 됨 ✅ 가능
용도 결과만 빠르게 확인 이후 실습 계속할 때 유리

✍️ 실제 사용 팁

  • -e → 배치 처리, 자동 테스트, 로그 수집용 스크립트 실행 등에 적합
  • -i → 수동 실습, 디버깅, 쿼리 실험에 적합