图构建:从 Pandas 导入

Open In Colab

此 Jupyter 笔记本托管于 此处,位于 Neo4j 图数据科学客户端的 Github 仓库中。

该笔记本展示了如何使用 gds.graph.construct 方法(仅在 GDS 2.1+ 可用)在内存中直接构建图。

如果您使用 AuraDS,当前无法将投影的图导回 Neo4j。

1. 设置

我们需要一个可用 Neo4j 和 GDS 的环境,例如自带 GDS 的 AuraDS 或 Neo4j Desktop。

此外,您可以使用 Aura Graph Analytics,并跳过下方整个“设置”部分。

一旦获得该环境的凭据,就可以安装 graphdatascience 包并导入客户端类。

%pip install graphdatascience
import os

from graphdatascience import GraphDataScience

使用本地 Neo4j 设置时,默认连接 URI 为 bolt://:7687

# Get Neo4j DB URI, credentials and name from environment if applicable
NEO4J_URI = os.environ.get("NEO4J_URI", "bolt://:7687")
NEO4J_AUTH = None
NEO4J_DB = os.environ.get("NEO4J_DB", "neo4j")
if os.environ.get("NEO4J_USER") and os.environ.get("NEO4J_PASSWORD"):
    NEO4J_AUTH = (
        os.environ.get("NEO4J_USER"),
        os.environ.get("NEO4J_PASSWORD"),
    )
gds = GraphDataScience(NEO4J_URI, auth=NEO4J_AUTH, database=NEO4J_DB)

使用 AuraDS 时,连接 URI 略有不同,因为它使用 neo4j+s 协议。客户端还应包含 aura_ds=True 标志以启用 AuraDS 推荐的设置。

# On AuraDS:
#
# gds = GraphDataScience(NEO4J_URI, auth=NEO4J_AUTH, database=NEO4J_DB, aura_ds=True)
from graphdatascience import ServerVersion

assert gds.server_version() >= ServerVersion(2, 1, 0)

我们还导入 pandas,以从原始数据源创建 Pandas DataFrame

import pandas as pd

2. 加载 Cora 数据集

CORA_CONTENT = "https://data.neo4j.com/cora/cora.content"
CORA_CITES = "https://data.neo4j.com/cora/cora.cites"

我们可以将每个 CSV 本地加载为 Pandas DataFrame

content = pd.read_csv(CORA_CONTENT, header=None)
cites = pd.read_csv(CORA_CITES, header=None)

我们需要执行额外的预处理步骤,将 subject 字段(数据集中的字符串)转换为整数,因为节点属性必须是数值才能投影到图中。我们可以使用映射来实现。

SUBJECT_TO_ID = {
    "Neural_Networks": 0,
    "Rule_Learning": 1,
    "Reinforcement_Learning": 2,
    "Probabilistic_Methods": 3,
    "Theory": 4,
    "Genetic_Algorithms": 5,
    "Case_Based": 6,
}

现在我们可以创建一个新的 DataFrame,其中包含 nodeId 字段、节点标签列表,以及额外的节点属性 subject(使用 SUBJECT_TO_ID 映射)和 features(将所有特征列转换为单个数组列)。

nodes = pd.DataFrame().assign(
    nodeId=content[0],
    labels="Paper",
    subject=content[1].replace(SUBJECT_TO_ID),
    features=content.iloc[:, 2:].apply(list, axis=1),
)

让我们查看新 DataFrame 的前 5 行

nodes.head()

现在我们创建一个包含节点之间关系的新 DataFrame。要创建等价的无向图,需要显式添加正向和逆向关系。

dir_relationships = pd.DataFrame().assign(sourceNodeId=cites[0], targetNodeId=cites[1], relationshipType="CITES")
inv_relationships = pd.DataFrame().assign(sourceNodeId=cites[1], targetNodeId=cites[0], relationshipType="CITES")

relationships = pd.concat([dir_relationships, inv_relationships]).drop_duplicates()

同样,查看新 DataFrame 的前 5 行

relationships.head()

最后,我们可以创建内存中的图。

G = gds.graph.construct("cora-graph", nodes, relationships)

3. 使用图

让我们检查新图是否已创建

gds.graph.list()

让我们也统计图中的节点数量

G.node_count()

计数与 Pandas 数据集的行数相匹配

len(content)

我们可以对图中每个节点的 subject 节点属性值进行流式输出,仅打印前 10 条。

gds.graph.nodeProperties.stream(G, ["subject"]).head(10)

4. 清理

当图不再需要时,应将其删除以释放内存

G.drop()