数据集

为了支持快速、便捷地使用 graphdatascience,该库提供了一些功能,可以非常轻松地将一些有趣的数据集投影到服务器端的 GDS 中。其中一些数据集较小且内置于库中,另一些则较大并托管在其他地方,在加载时会自动在后台获取。

1. 内置数据集

为方便起见,该库附带了一些较小的内置数据集,加载速度非常快。这些数据集可以轻松导入 GDS,以获取表示该数据集的图对象。

这些数据集带有一个加载器方法,该方法接受两个可选参数:graph_name(用于指定图名称)和 undirected(接收布尔值,如果设置为 true,则将图作为无向图加载)。

如果图以 undirected = True 加载,则其关系数量将是有向版本的两倍。undirected 的默认值因数据集而异。

例如:

G = gds.graph.load_cora()

assert G.node_count() == 2_708
assert G.node_labels() == ["Paper"]

1.1. Cora

一个著名的引文网络,由《使用机器学习自动化构建互联网门户》一文引入,并被用于许多节点分类或链接预测出版物中。

默认情况下,Cora 以 undirected = False 加载。

表 1. Cora 图统计信息
名称

名称 (name)

cora

node_count

2_708

relationship_count (关系计数)

5_429

node_labels

['Paper']

relationship_types

['CITES']

node_properties

Paper: [features, subject]

relationship_properties

CITES: []

1.2. 空手道俱乐部 (Karate club)

一个由 Zachary 引入的著名社交网络。默认情况下,空手道俱乐部数据集以 undirected = False 加载。

表 2. 空手道俱乐部图统计信息
名称

名称 (name)

karate_club

node_count

34

relationship_count (关系计数)

78

node_labels

['Person']

relationship_types

['KNOWS']

node_properties

Person: []

relationship_properties

KNOWS: []

1.3. IMDB

一个异构图,用于对节点分类或链接预测模型进行基准测试,例如 异构图注意力网络 (Heterogeneous Graph Attention Network)MAGNN:用于异构图嵌入的元路径聚合图神经网络图变换网络 (Graph Transformer Networks)。该图包含演员、导演、电影(以及未分类电影)作为节点,以及演员与其参演电影之间、导演与其执导电影之间的关系。

默认情况下,IMDB 数据集以 undirected = True 加载。如果以有向方式加载,其关系数量将减半。

表 3. IMDB 图统计信息
名称

名称 (name)

imdb

node_count

12_772

relationship_count (关系计数)

37_288

node_labels

['Movie', 'Actor', 'Director', 'UnclassifiedMovie']

relationship_types

['ACTED_IN', 'DIRECTED_IN']

node_properties

Movie: [plot_keywords, genre], Actor: [plot_keywords], Director: [plot_keywords], UnclassifiedMovie: [plot_keywords]

relationship_properties

ACTED_IN: [], DIRECTED_IN: []

1.4. LastFM

一个用于链接预测模型基准测试的异构图,例如被 MAGNN 使用:用于异构图嵌入的元路径聚合图神经网络。数据和许可来自 HetRec 2011。原始数据来自 LastFM

该图包含 User(用户)和 Artist(艺术家)作为节点,每个节点都有一个 rawId 字段,对应于原始数据中的 ID。rawId 可用于(例如)通过参考 HetRec'11 .dat 文件来查询艺术家名称。

有三种类型的关系:

  • IS_FRIEND 存在于 User 节点之间,表示用户与用户之间的好友关系。

  • LISTEN_TO 存在于 UserArtist 节点之间,表示用户收听的艺术家。

  • weight 属性表示用户收听该艺术家的次数。

  • TAGGED 存在于 UserArtist 节点之间,表示用户标记过的艺术家。

  • tagID 属性代表一个流派。

  • daymonthyear 属性代表标记创建的时间。

  • timestamp 代表与上述日期相同的毫秒数(自 EPOCH 起)。

请注意,用户可以使用不同的 tagID 多次标记同一位艺术家。

默认情况下,LastFM 数据集以 undirected = True 加载。如果以有向方式加载,其关系数量将减半。

表 4. 默认 LastFM 图统计信息
名称

名称 (name)

lastfm

node_count

19_914

relationship_count (关系计数)

584_060

node_labels

['Artist', 'User']

relationship_types

['TAGGED', 'LISTEN_TO', 'IS_FRIEND']

node_properties

Artist: [rawId], User: [rawId]

relationship_properties

TAGGED: [year, month, day, tagID, timestamp], LISTEN_TO: [weight], IS_FRIEND: []

2. 来自开放图基准 (Open Graph Benchmark) 的数据集

库中提供了加载 Open Graph Benchmark (OGB) 数据集的便利方法。为了使用这些方法,必须为 graphdatascience 库安装 OGB 支持。

pip install graphdatascience[ogb]

用于公开 OGB 数据集加载功能的两个方法是:

这两个方法都返回一个 Graph 对象,并接受四个参数:

表 5. OGB 数据集加载方法参数
名称 类型

dataset_name

str

OGB 数据集的名称

dataset_root_path

str = "./dataset"

下载的 OGB 数据集的存储路径(可选)

graph_name

Optional[str]

创建的图的可选名称。默认为 dataset_name

concurrency

int = 4

可使用的可选线程数

OGB 加载方法在后台使用 OGB 库。因此,在加载新的 OGB 数据集时,数据集将从互联网下载,因此需要互联网连接。但是,如果 dataset_root_path 中已经存在该数据集,则无需连接互联网。

所有 OGB 数据集都以 DIRECTED(有向)方向加载到 GDS 中。然而,其中一些数据集在本质上是“实际上无向的”,即对于每一条关系,在同一节点之间也存在相反方向的关系。Open Graph Benchmark 网站告知我们哪些数据集属于这种情况。如果您希望投影出的图在 Neo4j GDS 的意义上是 UNDIRECTED(无向的),您可以使用 gds.graph.relationships.toUndirected 进行修改。

如果目标 GDS 服务器拥有企业版许可证并启用了 Arrow Flight Server,则 OGB 数据集的加载性能会非常好。如果不是,性能会差很多。加载时间将延长几个数量级,并需要占用更多的内存。事实上,可能需要增加 承载 GDS 的 Neo4j 数据库的最大堆大小,以便为加载提供足够的内存。

目前,加载方法不支持加载 OGB 数据集中的关系特征。每当加载包含关系特征的数据集时,这些特征将不会包含在投影中,并会发出警告。

根据数据集和任务的不同,投影到服务器端 GDS 中的图看起来会有所不同。

2.1. OGBN 图

用于节点属性预测的数据集。

2.1.1. 同构图

这些图在投影到服务器端 GDS 时将具有:

  • 最多三个表示数据集拆分的不相交节点标签:“Train”、“Valid” 和 “Test”

  • 所有关系共用一个关系类型 “R”

  • 所有节点上都有一个 “classLabel” 属性,由单个数字表示

  • 如果数据集提供,则所有节点上都有一个节点属性 “features”,由数字数组表示

让我们看一个加载并检查这些数据集之一的示例

加载 'ogbn-arxiv' 数据集的示例
G = gds.graph.ogbn.load("ogbn-arxiv")

assert G.name() == "ogbn-arxiv"
assert G.node_count() == 169_343
assert G.node_labels() == ["Train", "Valid", "Test"]
assert G.node_properties()["Train"] == ["features", "classLabel"]
assert G.relationship_count() == 1_166_243
assert G.relationship_types() == ["R"]
assert G.relationship_properties()["R"] == []

2.1.2. 异构图

这些图是异构的,因此根据定义,它们将具有多个节点标签和关系类型。这些标签和类型将在图投影中根据其在原始数据集中的名称来命名。此外,投影出的图还将具有:

  • 最多三个表示数据集拆分的不相交节点标签:“Train”、“Valid” 和 “Test”。这意味着节点可能具有多个标签

  • 目标预测节点上的 “classLabel” 属性,由单个数字表示

  • 如果数据集提供,则部分或全部节点上都有一个节点属性 “features”,由数字数组表示

让我们看一个加载并检查这些数据集之一的示例

加载 'ogbn-mag' 数据集的示例
G = gds.graph.ogbn.load("ogbn-mag")

assert G.name() == "ogbn-mag"
assert G.node_count() == 1_939_743
assert set(G.node_labels()) == {
	"Train",
	"Test",
	"Valid",
	"institution",
	"field_of_study",
	"paper",
	"author",
}
assert G.node_properties()["paper"] == ["features", "classLabel"]
assert G.node_properties()["institution"] == []
assert G.relationship_count() == 21_111_007
assert G.relationship_types() == ["cites", "writes", "affiliated_with", "has_topic"]

2.2. OGBL 图

用于链接属性预测的数据集。

2.2.1. 同构图

这些图用于链接预测。当投影到服务器端 GDS 时,它们将具有:

  • 所有节点共用一个节点标签 “N”

  • 最多六个表示数据集拆分的不相交关系类型:“TRAIN_POS”、“TRAIN_NEG”、“VALID_POS”、“VALID_NEG”、“TEST_POS”、“TEST_NEG”

  • 如果数据集提供,则所有节点上都有一个节点属性 “features”,由数字数组表示

让我们看一个加载并检查这些数据集之一的示例

加载 'ogbl-ddi' 数据集的示例
G = gds.graph.ogbl.load("ogbl-ddi")

assert G.name() == "ogbl-ddi"
assert G.node_count() == 4_267
assert G.node_labels() == ["N"]
assert G.node_properties()["N"] == []
assert G.relationship_count() == 1_334_889 + 197_481  # Positive + negative counts
assert G.relationship_types() == ["TRAIN_POS", "VALID_POS", "VALID_NEG", "TEST_POS", "TEST_NEG"]

ogbl-wikikg2 根据 OGB API 是一个同构数据集,但它有多种关系类型。因此,我们以与异构数据集相同的方式加载它。例如,我们将关系名称加上数据集拆分类型的后缀(见下文)。另请注意,由于该特定数据集中的负关系数量非常大,因此只会加载正关系。

2.2.2. 异构图

这些是用于知识图谱补全的异构图,因此根据定义,它们将具有多个节点标签和关系类型。节点标签将在图投影中根据其在原始数据集中的名称命名。作为对原始数据集命名的补充,关系类型名称将加上后缀(下划线加上数据集拆分中出现的集合类型:“TRAIN”、“VALID” 或 “TEST”)。

此外,投影出的图还将具有:

  • 所有关系上的 “classLabel” 属性,由单个非负整数表示。此整数与原始数据集的关系类型一一对应

  • 如果数据集提供,则部分或全部节点上都有一个节点属性 “features”,由数字数组表示

让我们看一个加载并检查这些数据集之一的示例

加载 'ogbl-biokg' 数据集的示例
G = gds.graph.ogbl.load("ogbl-biokg")

assert G.name() == "ogbl-biokg"
assert G.node_count() == 93_773
assert G.node_labels() == ["disease", "protein", "drug", "sideeffect", "function"]
assert G.node_properties()["protein"] == []
assert G.relationship_count() == 5_088_434
# For each of the train, valid and test sets: number of rel types
assert len(G.relationship_types()) == 51 * 3
assert G.relationship_properties()["drug-drug_polycystic_ovary_syndrome_TRAIN"] == ["classLabel"]

2.3. 社区版的限制

对于 GDS 社区版用户,大型图的性能可能会受到影响。数据库套接字连接可能会超时。如果发生这种情况,一种可能的解决方法是修改服务器配置 server.bolt.connection_keep_aliveserver.bolt.connection_keep_alive_probes。但请注意副作用,例如导致真正的连接问题需要更长时间才能被检测到。