콘텐츠로 이동
Graph 문서0.5

파일 형식과 외부 ID

최신 안정판 Graph 0.5.1 릴리스 기준

graph-io 처리 흐름

형식파일 경계알맞은 용도검증 근거
CSV정점·간선 파일 한 쌍표 형태 교환과 육안 확인CsvRoundTripTest.kt
Jackson 2 NDJSON레코드 단일 스트림Jackson 2 애플리케이션Jackson2RoundTripTest.kt
Jackson 3 NDJSON레코드 단일 스트림Jackson 3 애플리케이션Jackson3RoundTripTest.kt
GraphMLXML 그래프 문서그래프 도구 간 교환GraphMlRoundTripTest.kt

외부 ID는 가져오기 과정에서 정점과 간선을 연결하는 값이지, 백엔드의 GraphElementId 형식을 보장하는 값이 아니다. importer가 외부 ID와 새 정점 ID를 연결한 뒤 간선 끝점을 찾는다. GraphIoExternalIdMap.ktGraphIoExternalIdMapTest.kt를 확인한다.

전송 전에 속성 형식 변환, 중복 외부 ID 처리, 간선 순서, 문자셋, 잘못된 레코드 정책을 정한다. 전송 뒤에는 report 수치, 속성 표본, 찾지 못한 끝점, 다른 형식과의 왕복 결과를 본다. NDJSON은 정점보다 먼저 나온 간선을 잠시 보관하므로 한도 초과 실패도 시험해야 한다. Jackson3EdgeBufferOverflowTest.kt가 이 경계를 보여 준다.

id,label,name
u1,Person,Alice
u2,Person,Bob
id,label,from,to,since
e1,KNOWS,u1,u2,2024
val source = CsvGraphImportSource(
GraphImportSource.PathSource(Paths.get("vertices.csv")),
GraphImportSource.PathSource(Paths.get("edges.csv")),
)
val report = CsvGraphBulkImporter().importGraph(
source, ops,
GraphImportOptions(
onDuplicateVertexId = DuplicateVertexPolicy.SKIP,
onMissingEdgeEndpoint = MissingEndpointPolicy.FAIL,
preserveExternalIdProperty = "sourceId",
),
)
check(report.verticesCreated == 2L && report.edgesCreated == 1L)

CsvGraphBulkExporter().exportGraph(CsvGraphExportSink(...), ops, GraphExportOptions(setOf("Person"), setOf("KNOWS")))로 다시 내보낸다. header와 정점 2·간선 1의 기록 수를 확인한다.

u1을 한 번 더 넣으면 SKIP 정책에서 PARTIALskippedVertices가 보여야 한다. 간선의 tomissing으로 바꾸면 FAIL 정책은 READ_EDGE 단계에서 실패한다. NDJSON에서 정점보다 먼저 나온 간선을 maxEdgeBufferSize보다 많이 넣으면 메모리를 계속 쓰지 않고 overflow로 실패해야 한다. 재시도 전에 policy와 failure phase를 확인하고, 이미 만든 정점은 보존한 외부 ID로 대조한다.