图结构:从 Pandas 导入

Open In Colab

此 Jupyter 笔记本托管在 Neo4j 图数据科学客户端 Github 存储库的 此处

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

如果您使用的是 AuraDS,目前无法将投影后的图写回 Neo4j。

1. 设置

我们需要一个 Neo4j 和 GDS 可用的环境,例如 AuraDS(预装了 GDS)或 Neo4j 桌面。

一旦这些凭据可用,我们就可以安装 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.server_version.server_version 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()