本文将展示如何使用Python生成的数据来填充数据库。我还将向你展示如何使用Neo4j沙箱,这样就可以使用不同的Neo4j数据库设置。

可以在这里找到一个谷歌Colab笔记本:https://colab.research.google.com/drive/1J9__HotNoINHpucoipLH-4qWc48GALAk?usp=sharing

里面有这篇文章的代码。(那本笔记本上有如何连接Colab和Kaggle的说明,可以让你更快地下载数据。)

打开网易新闻 查看精彩图片

现在我们可以开始用Python做一些数据处理了。

为了写这篇文章,我们将使用在Kaggle上找到的arXiv数据集,其中包含超过170万篇STEM学术论文。(在写这篇文章的时候,已经是第18版了。)你可以将数据下载到本地机器

https://www.kaggle.com/Cornell-University/arxiv

现在进入笔记本,我们可以开始查看数据。我通过以下方式加载数据:

(你不必使用tqdm,但我发现在文件大小超过179万个条目时检查进度很有帮助。)

可以通过df看到,我们的数据结构为:

假设我们想用这个数据框构建一个图,我们想知道哪些作者发表了哪些论文,以及这些论文与哪些类别相关联。

然后,我们希望有三种不同的节点类型与之对应:作者、论文和类别。

每个节点类型都有一两个属性。对于作家来说,有作者的名字。论文可以有ID和标题。最后,类别有自己的名称。我们也有一些关系:作者和作者,论文和论文。

因此,我们的目标是拥有以下数据模型(用arrows.app绘制):

打开网易新闻 查看精彩图片

有一些列对我们很有用。例如,我打算保留id,这样我们就可以使用它作为每个论文的唯一索引。之后,我想要得到每个作者的个人列表。此外,authors_parsed列为我们提供了一个更清晰的所有作者列表。当然,我们将保留标题栏作为论文的主要属性。最后,我想保留categories列。

下一步是稍微清理一下数据,这样数据帧的每行有一个作者,每行有一个类别。例如,我们看到authors_parsed列给出了一个列表,其中每个条目在名称后面都有一个多余的逗号。

如果我们简单地将其导入到数据库中,我们将得到author节点,如(显示一个小示例):

由于这不是一件令人愉快的事情(并且会导致查询不是最优雅的),我们需要稍微清理一下。我们还看到categories列可以有一个单独的类别,也可以有几个不采用传统列表格式的类别(如本示例的最后一行所示):

我们可以在Cypher中这样做,但为了这篇文章的目的,我们将在Python中做清理,以便说明。

创建两个帮助函数来清理这两列:

得到的数据帧:

打开网易新闻 查看精彩图片