demos/connector/neo4j/cluster-gcn-on-cora-neo4j-example.ipynb
{
"cells": [
{
"cell_type": "markdown",
"id": "0",
"metadata": {},
"source": [
"# Cluster GCN on Neo4j"
]
},
{
"cell_type": "markdown",
"id": "1",
"metadata": {
"nbsphinx": "hidden",
"tags": [
"CloudRunner"
]
},
"source": [
"<table><tr><td>Run the latest release of this notebook:</td><td><a href=\"https://mybinder.org/v2/gh/stellargraph/stellargraph/master?urlpath=lab/tree/demos/connector/neo4j/cluster-gcn-on-cora-neo4j-example.ipynb\" alt=\"Open In Binder\" target=\"_parent\"><img src=\"https://mybinder.org/badge_logo.svg\"/></a></td><td><a href=\"https://colab.research.google.com/github/stellargraph/stellargraph/blob/master/demos/connector/neo4j/cluster-gcn-on-cora-neo4j-example.ipynb\" alt=\"Open In Colab\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\"/></a></td></tr></table>"
]
},
{
"cell_type": "markdown",
"id": "2",
"metadata": {},
"source": [
"This example demonstrates how to run Cluster GCN on a dataset stored entirely on disk with Neo4j. Our Neo4j Cluster GCN implementation iterates through user specified graph clusters and only ever stores the edges and features of one cluster in memory at any given time. This enables Cluster GCN to be used on extremely large datasets that don't fit into memory. \n",
"\n",
"\n",
"We use Cora here as an example, see [this notebook](./load-cora-into-neo4j.ipynb) for instructions on how to load the Cora dataset into Neo4j. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "3",
"metadata": {
"nbsphinx": "hidden",
"tags": [
"CloudRunner"
]
},
"outputs": [],
"source": [
"# install StellarGraph if running on Google Colab\n",
"import sys\n",
"if 'google.colab' in sys.modules:\n",
" %pip install -q stellargraph[demos]==1.3.0b"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "4",
"metadata": {
"nbsphinx": "hidden",
"tags": [
"VersionCheck"
]
},
"outputs": [],
"source": [
"# verify that we're using the correct version of StellarGraph for this notebook\n",
"import stellargraph as sg\n",
"\n",
"try:\n",
" sg.utils.validate_notebook_version(\"1.3.0b\")\n",
"except AttributeError:\n",
" raise ValueError(\n",
" f\"This notebook requires StellarGraph version 1.3.0b, but a different version {sg.__version__} is installed. Please see <https://github.com/stellargraph/stellargraph/issues/1172>.\"\n",
" ) from None"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "5",
"metadata": {},
"outputs": [],
"source": [
"import stellargraph as sg\n",
"from stellargraph.connector.neo4j import Neo4jStellarGraph\n",
"from stellargraph.layer import GCN\n",
"from stellargraph.mapper import ClusterNodeGenerator\n",
"import tensorflow as tf\n",
"import py2neo\n",
"import os\n",
"from sklearn import preprocessing, feature_extraction, model_selection\n",
"\n",
"import numpy as np\n",
"import scipy.sparse as sps\n",
"import pandas as pd"
]
},
{
"cell_type": "markdown",
"id": "6",
"metadata": {},
"source": [
"## Connect to Neo4j\n",
"\n",
"First we connect to the Neo4j with `py2neo`, we then create a `Neo4jStellarGraph` object."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "7",
"metadata": {},
"outputs": [],
"source": [
"default_host = os.environ.get(\"STELLARGRAPH_NEO4J_HOST\")\n",
"\n",
"# Create the Neo4j Graph database object; port, user, password parameters can be add to specify location and authentication\n",
"graph = py2neo.Graph(host=default_host)\n",
"neo4j_sg = Neo4jStellarGraph(graph)"
]
},
{
"cell_type": "markdown",
"id": "8",
"metadata": {},
"source": [
"## Data labels\n",
"\n",
"Here we get the node labels. Cluster GCN is semi-supervised and requires labels to be specified for some nodes."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "9",
"metadata": {},
"outputs": [],
"source": [
"# read the node labels from a seperate file\n",
"# note this function also returns a StellarGraph\n",
"# which we won't be using for this demo - we only need Neo4jStellarGraph!\n",
"_, labels = sg.datasets.Cora().load()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "10",
"metadata": {},
"outputs": [],
"source": [
"# split the node labels into train/test/val\n",
"\n",
"train_labels, test_labels = model_selection.train_test_split(\n",
" labels, train_size=140, test_size=None, stratify=labels\n",
")\n",
"val_labels, test_labels = model_selection.train_test_split(\n",
" test_labels, train_size=500, test_size=None, stratify=test_labels\n",
")\n",
"\n",
"target_encoding = preprocessing.LabelBinarizer()\n",
"\n",
"train_targets = target_encoding.fit_transform(train_labels)\n",
"val_targets = target_encoding.transform(val_labels)\n",
"test_targets = target_encoding.transform(test_labels)"
]
},
{
"cell_type": "markdown",
"id": "11",
"metadata": {},
"source": [
"## Neo4j Clustering\n",
"\n",
"We use one of the Neo4j Data Science Library's community detection algorithms to split our graph into clusters for ClusterGCN.\n",
"\n",
"We can use:\n",
"\n",
"- `louvain`: https://neo4j.com/docs/graph-data-science/current/algorithms/louvain/\n",
"- `labelPropagation`: https://neo4j.com/docs/graph-data-science/current/algorithms/label-propagation/="
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "12",
"metadata": {},
"outputs": [],
"source": [
"clusters = neo4j_sg.clusters(method=\"louvain\")"
]
},
{
"cell_type": "markdown",
"id": "13",
"metadata": {},
"source": [
"## Keras sequences\n",
"\n",
"We now use `StellarGraph` to create Keras sequences for training, testing, and validation. Under the hood, these sequences connect to your Neo4j database and lazily load data for each cluster."
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "14",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of clusters 173\n",
"0 cluster has size 118\n",
"1 cluster has size 413\n",
"2 cluster has size 167\n",
"3 cluster has size 38\n",
"4 cluster has size 67\n",
"5 cluster has size 226\n",
"6 cluster has size 18\n",
"7 cluster has size 68\n",
"8 cluster has size 26\n",
"9 cluster has size 60\n",
"10 cluster has size 83\n",
"11 cluster has size 118\n",
"12 cluster has size 73\n",
"13 cluster has size 3\n",
"14 cluster has size 22\n",
"15 cluster has size 36\n",
"16 cluster has size 237\n",
"17 cluster has size 12\n",
"18 cluster has size 1\n",
"19 cluster has size 128\n",
"20 cluster has size 41\n",
"21 cluster has size 11\n",
"22 cluster has size 60\n",
"23 cluster has size 5\n",
"24 cluster has size 3\n",
"25 cluster has size 100\n",
"26 cluster has size 27\n",
"27 cluster has size 1\n",
"28 cluster has size 39\n",
"29 cluster has size 2\n",
"30 cluster has size 18\n",
"31 cluster has size 11\n",
"32 cluster has size 3\n",
"33 cluster has size 5\n",
"34 cluster has size 8\n",
"35 cluster has size 14\n",
"36 cluster has size 3\n",
"37 cluster has size 2\n",
"38 cluster has size 51\n",
"39 cluster has size 2\n",
"40 cluster has size 5\n",
"41 cluster has size 4\n",
"42 cluster has size 10\n",
"43 cluster has size 5\n",
"44 cluster has size 15\n",
"45 cluster has size 5\n",
"46 cluster has size 1\n",
"47 cluster has size 4\n",
"48 cluster has size 3\n",
"49 cluster has size 6\n",
"50 cluster has size 1\n",
"51 cluster has size 3\n",
"52 cluster has size 6\n",
"53 cluster has size 8\n",
"54 cluster has size 2\n",
"55 cluster has size 2\n",
"56 cluster has size 1\n",
"57 cluster has size 13\n",
"58 cluster has size 1\n",
"59 cluster has size 6\n",
"60 cluster has size 1\n",
"61 cluster has size 10\n",
"62 cluster has size 10\n",
"63 cluster has size 5\n",
"64 cluster has size 2\n",
"65 cluster has size 4\n",
"66 cluster has size 12\n",
"67 cluster has size 3\n",
"68 cluster has size 2\n",
"69 cluster has size 5\n",
"70 cluster has size 1\n",
"71 cluster has size 2\n",
"72 cluster has size 1\n",
"73 cluster has size 2\n",
"74 cluster has size 2\n",
"75 cluster has size 2\n",
"76 cluster has size 2\n",
"77 cluster has size 1\n",
"78 cluster has size 2\n",
"79 cluster has size 2\n",
"80 cluster has size 9\n",
"81 cluster has size 1\n",
"82 cluster has size 2\n",
"83 cluster has size 2\n",
"84 cluster has size 1\n",
"85 cluster has size 2\n",
"86 cluster has size 2\n",
"87 cluster has size 2\n",
"88 cluster has size 1\n",
"89 cluster has size 1\n",
"90 cluster has size 2\n",
"91 cluster has size 2\n",
"92 cluster has size 1\n",
"93 cluster has size 1\n",
"94 cluster has size 2\n",
"95 cluster has size 1\n",
"96 cluster has size 2\n",
"97 cluster has size 2\n",
"98 cluster has size 2\n",
"99 cluster has size 2\n",
"100 cluster has size 3\n",
"101 cluster has size 5\n",
"102 cluster has size 5\n",
"103 cluster has size 4\n",
"104 cluster has size 1\n",
"105 cluster has size 13\n",
"106 cluster has size 1\n",
"107 cluster has size 3\n",
"108 cluster has size 3\n",
"109 cluster has size 2\n",
"110 cluster has size 2\n",
"111 cluster has size 3\n",
"112 cluster has size 2\n",
"113 cluster has size 1\n",
"114 cluster has size 1\n",
"115 cluster has size 1\n",
"116 cluster has size 2\n",
"117 cluster has size 3\n",
"118 cluster has size 2\n",
"119 cluster has size 2\n",
"120 cluster has size 2\n",
"121 cluster has size 2\n",
"122 cluster has size 12\n",
"123 cluster has size 1\n",
"124 cluster has size 4\n",
"125 cluster has size 1\n",
"126 cluster has size 2\n",
"127 cluster has size 2\n",
"128 cluster has size 1\n",
"129 cluster has size 2\n",
"130 cluster has size 1\n",
"131 cluster has size 2\n",
"132 cluster has size 8\n",
"133 cluster has size 2\n",
"134 cluster has size 2\n",
"135 cluster has size 2\n",
"136 cluster has size 1\n",
"137 cluster has size 2\n",
"138 cluster has size 1\n",
"139 cluster has size 2\n",
"140 cluster has size 3\n",
"141 cluster has size 1\n",
"142 cluster has size 2\n",
"143 cluster has size 4\n",
"144 cluster has size 2\n",
"145 cluster has size 2\n",
"146 cluster has size 2\n",
"147 cluster has size 2\n",
"148 cluster has size 2\n",
"149 cluster has size 2\n",
"150 cluster has size 2\n",
"151 cluster has size 2\n",
"152 cluster has size 1\n",
"153 cluster has size 4\n",
"154 cluster has size 1\n",
"155 cluster has size 3\n",
"156 cluster has size 2\n",
"157 cluster has size 2\n",
"158 cluster has size 1\n",
"159 cluster has size 1\n",
"160 cluster has size 3\n",
"161 cluster has size 2\n",
"162 cluster has size 1\n",
"163 cluster has size 2\n",
"164 cluster has size 2\n",
"165 cluster has size 2\n",
"166 cluster has size 2\n",
"167 cluster has size 1\n",
"168 cluster has size 2\n",
"169 cluster has size 2\n",
"170 cluster has size 1\n",
"171 cluster has size 2\n",
"172 cluster has size 2\n"
]
}
],
"source": [
"# create the Neo4jClusterNodeGenerator\n",
"# and the keras sequence objects\n",
"\n",
"generator = ClusterNodeGenerator(neo4j_sg, clusters=clusters)\n",
"\n",
"train_gen = generator.flow(train_labels.index, targets=train_targets)\n",
"val_gen = generator.flow(val_labels.index, targets=val_targets)\n",
"test_gen = generator.flow(test_labels.index, targets=test_targets)"
]
},
{
"cell_type": "markdown",
"id": "15",
"metadata": {},
"source": [
"## Create and train your model!\n",
"\n",
"Now we create and train the Cluster GCN model."
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "16",
"metadata": {},
"outputs": [],
"source": [
"# create the model\n",
"cluster_gcn = GCN(\n",
" layer_sizes=[32, 32], generator=generator, activations=[\"relu\", \"relu\"], dropout=0.5,\n",
")\n",
"\n",
"x_in, x_out = cluster_gcn.in_out_tensors()\n",
"predictions = tf.keras.layers.Dense(units=val_targets.shape[1], activation=\"softmax\")(\n",
" x_out\n",
")\n",
"model = tf.keras.Model(x_in, predictions)\n",
"model.compile(\n",
" optimizer=tf.keras.optimizers.Adam(lr=0.01),\n",
" loss=tf.keras.losses.categorical_crossentropy,\n",
" metrics=[\"acc\"],\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "17",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" ['...']\n",
" ['...']\n",
"Train for 173 steps, validate for 173 steps\n",
"Epoch 1/10\n",
"173/173 [==============================] - 9s 50ms/step - loss: 0.4474 - acc: 0.2357 - val_loss: 0.8697 - val_acc: 0.3040\n",
"Epoch 2/10\n",
"173/173 [==============================] - 7s 41ms/step - loss: 0.3968 - acc: 0.3786 - val_loss: 0.6322 - val_acc: 0.6740\n",
"Epoch 3/10\n",
"173/173 [==============================] - 7s 42ms/step - loss: 0.2307 - acc: 0.5500 - val_loss: 0.7893 - val_acc: 0.4980\n",
"Epoch 4/10\n",
"173/173 [==============================] - 7s 41ms/step - loss: 0.1732 - acc: 0.6214 - val_loss: 0.7399 - val_acc: 0.5860\n",
"Epoch 5/10\n",
"173/173 [==============================] - 7s 42ms/step - loss: 0.1245 - acc: 0.8000 - val_loss: 0.8939 - val_acc: 0.6680\n",
"Epoch 6/10\n",
"173/173 [==============================] - 7s 41ms/step - loss: 0.1719 - acc: 0.8500 - val_loss: 1.3818 - val_acc: 0.5820\n",
"Epoch 7/10\n",
"173/173 [==============================] - 7s 41ms/step - loss: 0.1494 - acc: 0.8357 - val_loss: 0.9496 - val_acc: 0.7220\n",
"Epoch 8/10\n",
"173/173 [==============================] - 7s 41ms/step - loss: 0.1257 - acc: 0.8929 - val_loss: 0.7883 - val_acc: 0.7200\n",
"Epoch 9/10\n",
"173/173 [==============================] - 7s 40ms/step - loss: 0.1114 - acc: 0.9286 - val_loss: 0.6892 - val_acc: 0.7140\n",
"Epoch 10/10\n",
"173/173 [==============================] - 7s 42ms/step - loss: 0.1298 - acc: 0.8929 - val_loss: 0.7618 - val_acc: 0.7320\n"
]
}
],
"source": [
"# train the model!\n",
"history = model.fit(train_gen, validation_data=val_gen, epochs=10)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "18",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" ['...']\n",
"173/173 [==============================] - 4s 21ms/step - loss: 1.4353 - acc: 0.7689\n"
]
},
{
"data": {
"text/plain": [
"[1.4352797645499302, 0.7688588]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# evaluate the model\n",
"model.evaluate(test_gen)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "19",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 504x576 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sg.utils.plot_history(history)"
]
},
{
"cell_type": "markdown",
"id": "20",
"metadata": {},
"source": [
"And that's it! We've trained a graph neural network without ever loading the whole graph into memory.\n",
"\n",
"Please refer to [cluster-gcn-node-classification](./../../node-classification/cluster-gcn-node-classification.ipynb) for **node embedding visualization**."
]
},
{
"cell_type": "markdown",
"id": "21",
"metadata": {
"nbsphinx": "hidden",
"tags": [
"CloudRunner"
]
},
"source": [
"<table><tr><td>Run the latest release of this notebook:</td><td><a href=\"https://mybinder.org/v2/gh/stellargraph/stellargraph/master?urlpath=lab/tree/demos/connector/neo4j/cluster-gcn-on-cora-neo4j-example.ipynb\" alt=\"Open In Binder\" target=\"_parent\"><img src=\"https://mybinder.org/badge_logo.svg\"/></a></td><td><a href=\"https://colab.research.google.com/github/stellargraph/stellargraph/blob/master/demos/connector/neo4j/cluster-gcn-on-cora-neo4j-example.ipynb\" alt=\"Open In Colab\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\"/></a></td></tr></table>"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.9"
}
},
"nbformat": 4,
"nbformat_minor": 2
}