| { |
| "cells": [ |
| { |
| "cell_type": "markdown", |
| "metadata": {}, |
| "source": [ |
| "# Single source shortest path\n", |
| "Given a graph and a source vertex, the single source shortest path (SSSP) algorithm finds a path from the source vertex to every other vertex in the graph, such that the sum of the weights of the path's edges is minimized.\n", |
| "\n", |
| "SSSP was added in MADlib 1.10 and grouping was added in 1.11." |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 3, |
| "metadata": { |
| "collapsed": false |
| }, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "The sql extension is already loaded. To reload it, use:\n", |
| " %reload_ext sql\n" |
| ] |
| } |
| ], |
| "source": [ |
| "%load_ext sql" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 4, |
| "metadata": { |
| "collapsed": false |
| }, |
| "outputs": [ |
| { |
| "data": { |
| "text/plain": [ |
| "u'Connected: gpdbchina@madlib'" |
| ] |
| }, |
| "execution_count": 4, |
| "metadata": {}, |
| "output_type": "execute_result" |
| } |
| ], |
| "source": [ |
| "# Greenplum 4.3.10.0\n", |
| "%sql postgresql://gpdbchina@10.194.10.68:61000/madlib\n", |
| " \n", |
| "# PostgreSQL local\n", |
| "#%sql postgresql://fmcquillan@localhost:5432/madlib\n", |
| "\n", |
| "# Greenplum 4.2.3.0\n", |
| "#%sql postgresql://gpdbchina@10.194.10.68:55000/madlib" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 5, |
| "metadata": { |
| "collapsed": false |
| }, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "1 rows affected.\n" |
| ] |
| }, |
| { |
| "data": { |
| "text/html": [ |
| "<table>\n", |
| " <tr>\n", |
| " <th>version</th>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>MADlib version: 1.11-dev, git revision: rel/v1.9.1-74-g1cc0efc, cmake configuration time: Fri Apr 14 23:56:52 UTC 2017, build type: Release, build system: Linux-2.6.18-238.27.1.el5.hotfix.bz516490, C compiler: gcc 4.4.0, C++ compiler: g++ 4.4.0</td>\n", |
| " </tr>\n", |
| "</table>" |
| ], |
| "text/plain": [ |
| "[(u'MADlib version: 1.11-dev, git revision: rel/v1.9.1-74-g1cc0efc, cmake configuration time: Fri Apr 14 23:56:52 UTC 2017, build type: Release, build system: Linux-2.6.18-238.27.1.el5.hotfix.bz516490, C compiler: gcc 4.4.0, C++ compiler: g++ 4.4.0',)]" |
| ] |
| }, |
| "execution_count": 5, |
| "metadata": {}, |
| "output_type": "execute_result" |
| } |
| ], |
| "source": [ |
| "%sql select madlib.version();\n", |
| "#%sql select version();" |
| ] |
| }, |
| { |
| "cell_type": "markdown", |
| "metadata": {}, |
| "source": [ |
| "# 1. Create vertex and edge tables" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 6, |
| "metadata": { |
| "collapsed": false |
| }, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "Done.\n", |
| "Done.\n", |
| "Done.\n", |
| "8 rows affected.\n", |
| "12 rows affected.\n", |
| "12 rows affected.\n" |
| ] |
| }, |
| { |
| "data": { |
| "text/html": [ |
| "<table>\n", |
| " <tr>\n", |
| " <th>src</th>\n", |
| " <th>dest</th>\n", |
| " <th>weight</th>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>1</td>\n", |
| " <td>1.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>2</td>\n", |
| " <td>1.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>4</td>\n", |
| " <td>10.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>2</td>\n", |
| " <td>2.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>3</td>\n", |
| " <td>10.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>2</td>\n", |
| " <td>3</td>\n", |
| " <td>1.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>2</td>\n", |
| " <td>5</td>\n", |
| " <td>1.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>2</td>\n", |
| " <td>6</td>\n", |
| " <td>3.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>3</td>\n", |
| " <td>0</td>\n", |
| " <td>1.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>4</td>\n", |
| " <td>0</td>\n", |
| " <td>-2.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>5</td>\n", |
| " <td>6</td>\n", |
| " <td>1.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>6</td>\n", |
| " <td>7</td>\n", |
| " <td>1.0</td>\n", |
| " </tr>\n", |
| "</table>" |
| ], |
| "text/plain": [ |
| "[(0, 1, 1.0),\n", |
| " (0, 2, 1.0),\n", |
| " (0, 4, 10.0),\n", |
| " (1, 2, 2.0),\n", |
| " (1, 3, 10.0),\n", |
| " (2, 3, 1.0),\n", |
| " (2, 5, 1.0),\n", |
| " (2, 6, 3.0),\n", |
| " (3, 0, 1.0),\n", |
| " (4, 0, -2.0),\n", |
| " (5, 6, 1.0),\n", |
| " (6, 7, 1.0)]" |
| ] |
| }, |
| "execution_count": 6, |
| "metadata": {}, |
| "output_type": "execute_result" |
| } |
| ], |
| "source": [ |
| "%%sql \n", |
| "DROP TABLE IF EXISTS vertex, edge;\n", |
| "\n", |
| "CREATE TABLE vertex(\n", |
| " id INTEGER\n", |
| " );\n", |
| "\n", |
| "CREATE TABLE edge(\n", |
| " src INTEGER,\n", |
| " dest INTEGER,\n", |
| " weight FLOAT8\n", |
| " );\n", |
| "\n", |
| "INSERT INTO vertex VALUES\n", |
| "(0),\n", |
| "(1),\n", |
| "(2),\n", |
| "(3),\n", |
| "(4),\n", |
| "(5),\n", |
| "(6),\n", |
| "(7);\n", |
| "\n", |
| "INSERT INTO edge VALUES\n", |
| "(0, 1, 1.0),\n", |
| "(0, 2, 1.0),\n", |
| "(0, 4, 10.0),\n", |
| "(1, 2, 2.0),\n", |
| "(1, 3, 10.0),\n", |
| "(2, 3, 1.0),\n", |
| "(2, 5, 1.0),\n", |
| "(2, 6, 3.0),\n", |
| "(3, 0, 1.0),\n", |
| "(4, 0, -2.0),\n", |
| "(5, 6, 1.0),\n", |
| "(6, 7, 1.0);\n", |
| "\n", |
| "SELECT * FROM edge ORDER BY src, dest;" |
| ] |
| }, |
| { |
| "cell_type": "markdown", |
| "metadata": {}, |
| "source": [ |
| "# 2. Calculate the shortest paths from vertex 0" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 7, |
| "metadata": { |
| "collapsed": false |
| }, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "Done.\n", |
| "1 rows affected.\n", |
| "8 rows affected.\n" |
| ] |
| }, |
| { |
| "data": { |
| "text/html": [ |
| "<table>\n", |
| " <tr>\n", |
| " <th>id</th>\n", |
| " <th>weight</th>\n", |
| " <th>parent</th>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>0.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>1.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>2</td>\n", |
| " <td>1.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>3</td>\n", |
| " <td>2.0</td>\n", |
| " <td>2</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>4</td>\n", |
| " <td>10.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>5</td>\n", |
| " <td>2.0</td>\n", |
| " <td>2</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>6</td>\n", |
| " <td>3.0</td>\n", |
| " <td>5</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>7</td>\n", |
| " <td>4.0</td>\n", |
| " <td>6</td>\n", |
| " </tr>\n", |
| "</table>" |
| ], |
| "text/plain": [ |
| "[(0, 0.0, 0),\n", |
| " (1, 1.0, 0),\n", |
| " (2, 1.0, 0),\n", |
| " (3, 2.0, 2),\n", |
| " (4, 10.0, 0),\n", |
| " (5, 2.0, 2),\n", |
| " (6, 3.0, 5),\n", |
| " (7, 4.0, 6)]" |
| ] |
| }, |
| "execution_count": 7, |
| "metadata": {}, |
| "output_type": "execute_result" |
| } |
| ], |
| "source": [ |
| "%%sql\n", |
| "DROP TABLE IF EXISTS out, out_summary;\n", |
| "\n", |
| "SELECT madlib.graph_sssp(\n", |
| " 'vertex', -- Vertex table\n", |
| " NULL, -- Vertex id column (NULL means use default naming)\n", |
| " 'edge', -- Edge table\n", |
| " NULL, -- Edge arguments (NULL means use default naming)\n", |
| " 0, -- Source vertex for path calculation\n", |
| " 'out'); -- Output table of shortest paths\n", |
| "\n", |
| "SELECT * FROM out ORDER BY id;" |
| ] |
| }, |
| { |
| "cell_type": "markdown", |
| "metadata": {}, |
| "source": [ |
| "# 3. Get the shortest path to vertex 5" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 9, |
| "metadata": { |
| "collapsed": false |
| }, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "Done.\n", |
| "1 rows affected.\n", |
| "1 rows affected.\n" |
| ] |
| }, |
| { |
| "data": { |
| "text/html": [ |
| "<table>\n", |
| " <tr>\n", |
| " <th>path</th>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>[0, 2, 5]</td>\n", |
| " </tr>\n", |
| "</table>" |
| ], |
| "text/plain": [ |
| "[([0, 2, 5],)]" |
| ] |
| }, |
| "execution_count": 9, |
| "metadata": {}, |
| "output_type": "execute_result" |
| } |
| ], |
| "source": [ |
| "%%sql\n", |
| "DROP TABLE IF EXISTS out_path;\n", |
| "SELECT madlib.graph_sssp_get_path('out',5, 'out_path');\n", |
| "SELECT * FROM out_path;" |
| ] |
| }, |
| { |
| "cell_type": "markdown", |
| "metadata": {}, |
| "source": [ |
| "# 4. Custom column names\n", |
| "Now let's do a similar example except using different column names in the tables (i.e., not the defaults). Create the vertex and edge tables:" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 10, |
| "metadata": { |
| "collapsed": false |
| }, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "Done.\n", |
| "8 rows affected.\n", |
| "12 rows affected.\n", |
| "12 rows affected.\n" |
| ] |
| }, |
| { |
| "data": { |
| "text/html": [ |
| "<table>\n", |
| " <tr>\n", |
| " <th>e_src</th>\n", |
| " <th>dest</th>\n", |
| " <th>e_weight</th>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>1</td>\n", |
| " <td>1.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>2</td>\n", |
| " <td>1.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>4</td>\n", |
| " <td>10.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>2</td>\n", |
| " <td>2.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>3</td>\n", |
| " <td>10.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>2</td>\n", |
| " <td>3</td>\n", |
| " <td>1.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>2</td>\n", |
| " <td>5</td>\n", |
| " <td>1.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>2</td>\n", |
| " <td>6</td>\n", |
| " <td>3.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>3</td>\n", |
| " <td>0</td>\n", |
| " <td>1.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>4</td>\n", |
| " <td>0</td>\n", |
| " <td>-2.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>5</td>\n", |
| " <td>6</td>\n", |
| " <td>1.0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>6</td>\n", |
| " <td>7</td>\n", |
| " <td>1.0</td>\n", |
| " </tr>\n", |
| "</table>" |
| ], |
| "text/plain": [ |
| "[(0, 1, 1.0),\n", |
| " (0, 2, 1.0),\n", |
| " (0, 4, 10.0),\n", |
| " (1, 2, 2.0),\n", |
| " (1, 3, 10.0),\n", |
| " (2, 3, 1.0),\n", |
| " (2, 5, 1.0),\n", |
| " (2, 6, 3.0),\n", |
| " (3, 0, 1.0),\n", |
| " (4, 0, -2.0),\n", |
| " (5, 6, 1.0),\n", |
| " (6, 7, 1.0)]" |
| ] |
| }, |
| "execution_count": 10, |
| "metadata": {}, |
| "output_type": "execute_result" |
| } |
| ], |
| "source": [ |
| "%%sql \n", |
| "DROP TABLE IF EXISTS vertex_alt, edge_alt;\n", |
| "CREATE TABLE vertex_alt AS SELECT id AS v_id FROM vertex;\n", |
| "CREATE TABLE edge_alt AS SELECT src AS e_src, dest, weight AS e_weight FROM edge;\n", |
| "SELECT * FROM edge_alt ORDER BY e_src, dest;" |
| ] |
| }, |
| { |
| "cell_type": "markdown", |
| "metadata": {}, |
| "source": [ |
| "# 5.0 Get the shortest path from vertex 1" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 12, |
| "metadata": { |
| "collapsed": false |
| }, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "Done.\n", |
| "1 rows affected.\n", |
| "8 rows affected.\n" |
| ] |
| }, |
| { |
| "data": { |
| "text/html": [ |
| "<table>\n", |
| " <tr>\n", |
| " <th>v_id</th>\n", |
| " <th>e_weight</th>\n", |
| " <th>parent</th>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>4.0</td>\n", |
| " <td>3</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>0.0</td>\n", |
| " <td>1</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>2</td>\n", |
| " <td>2.0</td>\n", |
| " <td>1</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>3</td>\n", |
| " <td>3.0</td>\n", |
| " <td>2</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>4</td>\n", |
| " <td>14.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>5</td>\n", |
| " <td>3.0</td>\n", |
| " <td>2</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>6</td>\n", |
| " <td>4.0</td>\n", |
| " <td>5</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>7</td>\n", |
| " <td>5.0</td>\n", |
| " <td>6</td>\n", |
| " </tr>\n", |
| "</table>" |
| ], |
| "text/plain": [ |
| "[(0, 4.0, 3),\n", |
| " (1, 0.0, 1),\n", |
| " (2, 2.0, 1),\n", |
| " (3, 3.0, 2),\n", |
| " (4, 14.0, 0),\n", |
| " (5, 3.0, 2),\n", |
| " (6, 4.0, 5),\n", |
| " (7, 5.0, 6)]" |
| ] |
| }, |
| "execution_count": 12, |
| "metadata": {}, |
| "output_type": "execute_result" |
| } |
| ], |
| "source": [ |
| "%%sql\n", |
| "DROP TABLE IF EXISTS out_alt, out_alt_summary;\n", |
| "\n", |
| "SELECT madlib.graph_sssp(\n", |
| " 'vertex_alt', -- Vertex table\n", |
| " 'v_id', -- Vertix id column (NULL means use default naming)\n", |
| " 'edge_alt', -- Edge table\n", |
| " 'src=e_src, weight=e_weight', -- Edge arguments (NULL means use default naming)\n", |
| " 1, -- Source vertex for path calculation\n", |
| " 'out_alt'); -- Output table of shortest paths\n", |
| "\n", |
| "SELECT * FROM out_alt ORDER BY v_id;" |
| ] |
| }, |
| { |
| "cell_type": "markdown", |
| "metadata": {}, |
| "source": [ |
| "# 6.0 Grouping\n", |
| "Create a graph with 2 groups and find SSSP for each group:" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 13, |
| "metadata": { |
| "collapsed": false |
| }, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "Done.\n", |
| "21 rows affected.\n", |
| "1 rows affected.\n", |
| "22 rows affected.\n" |
| ] |
| }, |
| { |
| "data": { |
| "text/html": [ |
| "<table>\n", |
| " <tr>\n", |
| " <th>src</th>\n", |
| " <th>dest</th>\n", |
| " <th>weight</th>\n", |
| " <th>grp</th>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>1</td>\n", |
| " <td>1.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>2</td>\n", |
| " <td>1.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>4</td>\n", |
| " <td>10.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>2</td>\n", |
| " <td>2.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>3</td>\n", |
| " <td>10.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>2</td>\n", |
| " <td>3</td>\n", |
| " <td>1.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>2</td>\n", |
| " <td>5</td>\n", |
| " <td>1.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>2</td>\n", |
| " <td>6</td>\n", |
| " <td>3.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>3</td>\n", |
| " <td>0</td>\n", |
| " <td>1.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>4</td>\n", |
| " <td>0</td>\n", |
| " <td>-2.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>5</td>\n", |
| " <td>6</td>\n", |
| " <td>1.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>6</td>\n", |
| " <td>7</td>\n", |
| " <td>1.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>1</td>\n", |
| " <td>1.0</td>\n", |
| " <td>1</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>2</td>\n", |
| " <td>1.0</td>\n", |
| " <td>1</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>4</td>\n", |
| " <td>10.0</td>\n", |
| " <td>1</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>2</td>\n", |
| " <td>2.0</td>\n", |
| " <td>1</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>3</td>\n", |
| " <td>10.0</td>\n", |
| " <td>1</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>2</td>\n", |
| " <td>3</td>\n", |
| " <td>1.0</td>\n", |
| " <td>1</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>2</td>\n", |
| " <td>5</td>\n", |
| " <td>1.0</td>\n", |
| " <td>1</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>3</td>\n", |
| " <td>0</td>\n", |
| " <td>1.0</td>\n", |
| " <td>1</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>4</td>\n", |
| " <td>0</td>\n", |
| " <td>-2.0</td>\n", |
| " <td>1</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>4</td>\n", |
| " <td>5</td>\n", |
| " <td>-20.0</td>\n", |
| " <td>1</td>\n", |
| " </tr>\n", |
| "</table>" |
| ], |
| "text/plain": [ |
| "[(0, 1, 1.0, 0),\n", |
| " (0, 2, 1.0, 0),\n", |
| " (0, 4, 10.0, 0),\n", |
| " (1, 2, 2.0, 0),\n", |
| " (1, 3, 10.0, 0),\n", |
| " (2, 3, 1.0, 0),\n", |
| " (2, 5, 1.0, 0),\n", |
| " (2, 6, 3.0, 0),\n", |
| " (3, 0, 1.0, 0),\n", |
| " (4, 0, -2.0, 0),\n", |
| " (5, 6, 1.0, 0),\n", |
| " (6, 7, 1.0, 0),\n", |
| " (0, 1, 1.0, 1),\n", |
| " (0, 2, 1.0, 1),\n", |
| " (0, 4, 10.0, 1),\n", |
| " (1, 2, 2.0, 1),\n", |
| " (1, 3, 10.0, 1),\n", |
| " (2, 3, 1.0, 1),\n", |
| " (2, 5, 1.0, 1),\n", |
| " (3, 0, 1.0, 1),\n", |
| " (4, 0, -2.0, 1),\n", |
| " (4, 5, -20.0, 1)]" |
| ] |
| }, |
| "execution_count": 13, |
| "metadata": {}, |
| "output_type": "execute_result" |
| } |
| ], |
| "source": [ |
| "%%sql\n", |
| "DROP TABLE IF EXISTS edge_gr;\n", |
| "\n", |
| "CREATE TABLE edge_gr AS\n", |
| "(\n", |
| " SELECT *, 0 AS grp FROM edge\n", |
| " UNION\n", |
| " SELECT *, 1 AS grp FROM edge WHERE src < 6 AND dest < 6\n", |
| ");\n", |
| "\n", |
| "INSERT INTO edge_gr VALUES\n", |
| "(4,5,-20,1);\n", |
| "\n", |
| "SELECT * FROM edge_gr ORDER BY grp, src, dest;" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 14, |
| "metadata": { |
| "collapsed": false |
| }, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "Done.\n", |
| "1 rows affected.\n", |
| "14 rows affected.\n" |
| ] |
| }, |
| { |
| "data": { |
| "text/html": [ |
| "<table>\n", |
| " <tr>\n", |
| " <th>grp</th>\n", |
| " <th>id</th>\n", |
| " <th>weight</th>\n", |
| " <th>parent</th>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>0</td>\n", |
| " <td>0.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>1</td>\n", |
| " <td>1.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>2</td>\n", |
| " <td>1.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>3</td>\n", |
| " <td>2.0</td>\n", |
| " <td>2</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>4</td>\n", |
| " <td>10.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>5</td>\n", |
| " <td>2.0</td>\n", |
| " <td>2</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>6</td>\n", |
| " <td>3.0</td>\n", |
| " <td>5</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>7</td>\n", |
| " <td>4.0</td>\n", |
| " <td>6</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>0</td>\n", |
| " <td>0.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>1</td>\n", |
| " <td>1.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>2</td>\n", |
| " <td>1.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>3</td>\n", |
| " <td>2.0</td>\n", |
| " <td>2</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>4</td>\n", |
| " <td>10.0</td>\n", |
| " <td>0</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>5</td>\n", |
| " <td>-10.0</td>\n", |
| " <td>4</td>\n", |
| " </tr>\n", |
| "</table>" |
| ], |
| "text/plain": [ |
| "[(0, 0, 0.0, 0),\n", |
| " (0, 1, 1.0, 0),\n", |
| " (0, 2, 1.0, 0),\n", |
| " (0, 3, 2.0, 2),\n", |
| " (0, 4, 10.0, 0),\n", |
| " (0, 5, 2.0, 2),\n", |
| " (0, 6, 3.0, 5),\n", |
| " (0, 7, 4.0, 6),\n", |
| " (1, 0, 0.0, 0),\n", |
| " (1, 1, 1.0, 0),\n", |
| " (1, 2, 1.0, 0),\n", |
| " (1, 3, 2.0, 2),\n", |
| " (1, 4, 10.0, 0),\n", |
| " (1, 5, -10.0, 4)]" |
| ] |
| }, |
| "execution_count": 14, |
| "metadata": {}, |
| "output_type": "execute_result" |
| } |
| ], |
| "source": [ |
| "%%sql\n", |
| "DROP TABLE IF EXISTS out_gr, out_gr_summary;\n", |
| "SELECT madlib.graph_sssp(\n", |
| " 'vertex', -- Vertex table\n", |
| " NULL, -- Vertex id column (NULL means use default naming)\n", |
| " 'edge_gr', -- Edge table\n", |
| " NULL, -- Edge arguments (NULL means use default naming)\n", |
| " 0, -- Source vertex for path calculation\n", |
| " 'out_gr', -- Output table of shortest paths\n", |
| " 'grp' -- Grouping columns\n", |
| ");\n", |
| "\n", |
| "SELECT * FROM out_gr ORDER BY grp, id;" |
| ] |
| }, |
| { |
| "cell_type": "markdown", |
| "metadata": {}, |
| "source": [ |
| "Find the path to vertex 5 for every group:" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 15, |
| "metadata": { |
| "collapsed": false |
| }, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "Done.\n", |
| "1 rows affected.\n", |
| "2 rows affected.\n" |
| ] |
| }, |
| { |
| "data": { |
| "text/html": [ |
| "<table>\n", |
| " <tr>\n", |
| " <th>grp</th>\n", |
| " <th>path</th>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>0</td>\n", |
| " <td>[0, 2, 5]</td>\n", |
| " </tr>\n", |
| " <tr>\n", |
| " <td>1</td>\n", |
| " <td>[0, 4, 5]</td>\n", |
| " </tr>\n", |
| "</table>" |
| ], |
| "text/plain": [ |
| "[(0, [0, 2, 5]), (1, [0, 4, 5])]" |
| ] |
| }, |
| "execution_count": 15, |
| "metadata": {}, |
| "output_type": "execute_result" |
| } |
| ], |
| "source": [ |
| "%%sql\n", |
| "DROP TABLE IF EXISTS out_gr_path;\n", |
| "SELECT madlib.graph_sssp_get_path('out_gr',5,'out_gr_path');\n", |
| "SELECT * FROM out_gr_path ORDER BY grp;" |
| ] |
| } |
| ], |
| "metadata": { |
| "kernelspec": { |
| "display_name": "Python 2", |
| "language": "python", |
| "name": "python2" |
| }, |
| "language_info": { |
| "codemirror_mode": { |
| "name": "ipython", |
| "version": 2 |
| }, |
| "file_extension": ".py", |
| "mimetype": "text/x-python", |
| "name": "python", |
| "nbconvert_exporter": "python", |
| "pygments_lexer": "ipython2", |
| "version": "2.7.12" |
| } |
| }, |
| "nbformat": 4, |
| "nbformat_minor": 0 |
| } |