1.4 외부 소스를 사용한 그래프 생성하기

(English Version)

외부 소스들로부터 DGLGraph 를 만드는 옵션들:

  • 그래프 및 회소 행렬을 위한 python 라이브러리(NetworkX 및 SciPy)로부터 변환하기

  • 디스크에서 그래프를 로딩하기

이 절에서는 다른 그래프를 변환해서 그래프를 생성하는 함수들은 다루지 않겠다. 그 방법들에 대한 소개는 매뉴얼의 API를 참조하자.

외부 라이브러리를 사용해서 그래프 생성하기

아래 코드는 SciPy 희소행렬과 NetworkX 그래프로부터 그래프를 생성하는 예제이다.

>>> import dgl
>>> import torch as th
>>> import scipy.sparse as sp
>>> spmat = sp.rand(100, 100, density=0.05) # 5% nonzero entries
>>> dgl.from_scipy(spmat)                   # from SciPy
Graph(num_nodes=100, num_edges=500,
      ndata_schemes={}
      edata_schemes={})

>>> import networkx as nx
>>> nx_g = nx.path_graph(5) # a chain 0-1-2-3-4
>>> dgl.from_networkx(nx_g) # from networkx
Graph(num_nodes=5, num_edges=8,
      ndata_schemes={}
      edata_schemes={})

nx.path_graph(5) 로부터 만들면 생성된 DGLGraph 는 4개가 아니라 8개의 에지를 갖는 점을 유의하자. 이유는 nx.path_graph(5) 는 방향이 없는 NetworkX 그래프 networkx.Graph 를 만드는데, DGLGraph 는 항상 방향이 있는 그래프이기 때문이다. 방향이 없는 NetworkX 그래프를 DGLGraph 로 변환하면, DGL은 내부적으로 방향이 없는 에지를 두개의 방향이 있는 에지로 변환한다. networkx.DiGraph 를 사용하면 이런 현상을 피할 수 있다.

>>> nxg = nx.DiGraph([(2, 1), (1, 2), (2, 3), (0, 0)])
>>> dgl.from_networkx(nxg)
Graph(num_nodes=4, num_edges=4,
      ndata_schemes={}
      edata_schemes={})

Note

내부적으로 DGL은 SciPy 행렬과 NetworkX 그래프를 텐서로 변환해서 그래프를 만든다. 따라서, 이 생성 방법은 성능이 중요한 곳에 사용되기 적합하지 않다.

참고할 API들: dgl.from_scipy() , dgl.from_networkx() .

디스크에서 그래프 로딩하기

그래프를 저장하기 위한 여러 데이터 포멧들이 있는데, 모든 옵션들을 나열하기는 불가능하다. 그래서 이 절에서는 공통적인 것들에 대한 일반적인 참조만 소개한다.

Comma Separated Values (CSV)

아주 일반적인 포멧으로 CSV가 사용된다. 이는 노드, 에치, 그리고 그것들의 피처들을 테이블 형태로 저장한다.

nodes.csv

age, title

43, 1

23, 3

edges.csv

src, dst, weight

0, 1, 0.4

0, 3, 0.9

잘 알려진 Python 라이브러리들(예, pandas)을 사용해서 이 형태의 데이터를 python 객체(예, numpy.ndarray )로 로딩하고, 이를 DGLGraph로 변환하는데 사용할 수 있다. 만약 백엔드 프레임워크가 디스크에서 텐서를 저장하고/읽는 기능(예, torch.save() , torch.load() )을 제공한다면, 그래프를 만드는데 이용할 수 있다.

함께 참조하기: Tutorial for loading a Karate Club Network from edge pairs CSV.

JSON/GML 포멧

특별히 빠르지는 않지만 NetworkX는 다양한 데이터 포멧 을 파싱하는 유틸리티들을 제공하는데, 이를 통해서 DGL 그래프를 만들 수 있다.

DGL 바이너리 포멧

DGL은 디스크에 그래프를 바이너리 형태로 저장하고 로딩하는 API들을 제공한다. 그래프 구조와 더불어, API들은 피처 데이터와 그래프 수준의 레이블 데이터도 다룰 수 있다. DGL은 그래프를 직접 S3 또는 HDFS에 체크포인트를 할 수 있는 기능을 제공한다. 러퍼런스 메뉴얼에 자세한 내용이 있으니 참고하자.

참고할 API들: dgl.save_graphs() , dgl.load_graphs()