数据集

为了支持快速方便地使用 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. 空手道俱乐部

一个众所周知的社交网络,由 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

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

默认情况下,将 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

该图包含用户和艺术家作为节点,每个节点都有一个 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. 来自开放图基准的数据集

该库中有一些方便的方法可以加载 开放图基准 数据集。为了使用这些方法,必须为 graphdatascience 库安装 OGB 支持

pip install graphdatascience[ogb]

公开 OGB 数据集加载功能的两种方法是

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

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

dataset_name

str

ODB 数据集的名称

dataset_root_path

str = "./dataset"

用于存储下载的 OGB 数据集的可选路径

graph_name

Optional[str]

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

concurrency

int = 4

要使用的线程数的可选参数

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

所有 OGB 数据集都以方向 DIRECTED 加载到 GDS 中。但是,一些数据集在某种意义上实际上是无向的,即对于每个关系,节点之间相同方向的关系也存在。 开放图基准 网站告知我们哪些数据集属于这种情况。如果您希望投影的图在 Neo4j GDS 的意义上为 UNDIRECTED,您可以使用 gds.beta.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。但是,请注意,这样做会有副作用,例如真正的连接问题现在需要更长时间才能被检测到。