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 → 수동 실습, 디버깅, 쿼리 실험에 적합