| { |
| "cells": [ |
| { |
| "attachments": {}, |
| "cell_type": "markdown", |
| "id": "722ec93e-b87c-43d0-9c54-61b30933d892", |
| "metadata": {}, |
| "source": [ |
| "# AGE Samples \n", |
| "\n", |
| "## Prepare\n", |
| "```\n", |
| "import age\n", |
| "```\n", |
| "## Connect to PostgreSQL(with AGE extension)\n", |
| "* Connect to PostgreSQL server \n", |
| "* Load AGE and register agtype to db session (Psycopg2 driver)\n", |
| "* Check graph exists and set graph. If not, age make that.\n", |
| "\n", |
| "```\n", |
| "ag = age.connect(graph=\"(graph name}\", host=\"{host}\", port=\"{port}\", dbname=\"{dbname}\", user=\"{db username}\", password=\"{password}\")\n", |
| "\n", |
| "# or \n", |
| "DSN = \"host={host} port={port} dbname={dbname} user={db username} password={password}\"\n", |
| "ag = age.connect(graph=\"(graph name}\", dsn=DSN)\n", |
| "\n", |
| "# or Without Graph Name : you can make a new graph later.\n", |
| "\n", |
| "ag = age.connect(host=\"{host}\", port=\"{port}\", dbname=\"{dbname}\", user=\"{db username}\", password=\"{password}\")\n", |
| "\n", |
| "# And set graph - if you don't have one yet, setGraph make that.)\n", |
| "ag = age.setGraph(\"{graph name}\")\n", |
| "```" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 1, |
| "id": "34eaaafe-d9dc-442f-8248-0824c46c7b20", |
| "metadata": { |
| "tags": [] |
| }, |
| "outputs": [], |
| "source": [ |
| "import age\n", |
| "from age.gen.AgtypeParser import *\n", |
| "\n", |
| "GRAPH_NAME = \"test_graph\"\n", |
| "DSN = \"host=172.17.0.2 port=5432 dbname=postgres user=postgres password=agens\"\n", |
| "\n", |
| "ag = age.connect(graph=GRAPH_NAME, dsn=DSN)\n" |
| ] |
| }, |
| { |
| "attachments": {}, |
| "cell_type": "markdown", |
| "id": "96bbaf49-e774-4939-8fe9-f179ac9addc9", |
| "metadata": {}, |
| "source": [ |
| "---\n", |
| "# API\n", |
| "\n", |
| "### age.connect(graph:str=None, dsn:str=None, connection_factory=None, cursor_factory=None, **kwargs) -> Age\n", |
| "> Connect PostgreSQL server \n", |
| " Parameters : dsn={dsn} or \n", |
| " host=\"{host}\", port=\"{port}\", dbname=\"{dbname}\", user=\"{db username}\", password=\"{password}\"\n", |
| "\n", |
| "### Age.commit() , Age.rollback()\n", |
| "> If your statement change data, you must call 'Age.commit()' explicitly. Otherwise change will not make effect.\n", |
| "> Or when execution error occurs, you must call 'Age.rollback()'\n", |
| "\n", |
| "### Age.close()\n", |
| "> Closes connection to PostgreSQL.\n", |
| "\n", |
| "### Age.execCypher(cypherStmt:str, cols:list=None, params:tuple=None) -> psycopg2.extensions.cursor :\n", |
| "> Execute cypher statements to query or change data (CREATE, SET, REMOVE) with or without result.\n", |
| "> If your statement change data, you must call 'Age.commit()' explicitly. Otherwise change will not make effect.\n", |
| " \n", |
| "> If your execution returns no result or only one result, you don't have to set 'cols' argument.\n", |
| "> But it returns many columns, you have to pass columns names(and types) to 'cols' argument.\n", |
| "\n", |
| "> cols : str list \\[ 'colName {type}', ... \\] : If column data type is not set, agtype is default.\n", |
| " \n", |
| "### Age.cypher(cursor:psycopg2.extensions.cursor, cypherStmt:str, cols:list=None, params:tuple=None) -> psycopg2.extensions.cursor :\n", |
| "> If you want execute many statements (changing data statement maybe) with one transaction explicitly, you may use Age.cypher(...) function.\n", |
| "\n", |
| "> For creating cursor and mamage transaction, you usually use 'with' clause.\n", |
| " \n", |
| "> If your execution returns no result or only one result, you don't have to set 'cols' argument.\n", |
| "> But it returns many columns, you have to pass columns names(and types) to 'cols' argument.\n", |
| "\n", |
| "> cols : str list \\[ 'colName {type}', ... \\] : If column data type is not set, agtype is default.\n", |
| " " |
| ] |
| }, |
| { |
| "attachments": {}, |
| "cell_type": "markdown", |
| "id": "0f15bc37-4b19-4204-af93-757b07e7e9f9", |
| "metadata": {}, |
| "source": [ |
| "---\n", |
| "## Create & Change Vertices\n", |
| "\n", |
| "> If cypher statement changes data (create, set, remove), \n", |
| " you must use execCypher(cypherStmt, commit, *args). \n", |
| " \n", |
| "> If **'commit'** argument is **True**: the cypherStmt make effect automatically, but cursor is closed after execution. So you cannot access the result. \n", |
| " If **False** : you can access the result, but you must commit session(ag.commit()) explicitly.\n", |
| " (Otherwise the execution cannot make any effect.)\n", |
| "\n", |
| "\n", |
| "> execCypher(cypherStmt:str, commit:bool, *args) \n", |
| "\n", |
| "```\n", |
| "cursor = ag.execCypher(\"CREATE(...)\", commit=False) # Cypher Create Statement\n", |
| "...\n", |
| "# check result in cursor\n", |
| "...\n", |
| "ag.commit() # commit explicitly\n", |
| "```\n" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 2, |
| "id": "99cbc91e-55ae-4d2e-b81e-a655f88ec807", |
| "metadata": {}, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "CREATED: {label:Person, id:844424930131971, properties:{name: Jack}}::VERTEX\n", |
| "CREATED: 844424930131972\n", |
| "SET: \"Manager\"\n", |
| "REMOVE Prop: 844424930131970\n" |
| ] |
| } |
| ], |
| "source": [ |
| "# Create Vertices\n", |
| "ag.execCypher(\"CREATE (n:Person {name: 'Joe'})\")\n", |
| "ag.execCypher(\"CREATE (n:Person {name: 'Smith'})\")\n", |
| " \n", |
| "# Execution with one agtype result\n", |
| "cursor = ag.execCypher(\"CREATE (n:Person {name: %s}) RETURN n\", params=('Jack',))\n", |
| "for row in cursor:\n", |
| " print(\"CREATED: \", row[0]) \n", |
| " \n", |
| "cursor = ag.execCypher(\"CREATE (n:Person {name: %s, title: 'Developer'}) RETURN id(n)\", params=('Andy',))\n", |
| "for row in cursor:\n", |
| " print(\"CREATED: \", row[0])\n", |
| " \n", |
| "\n", |
| "# Execution with one result as SQL TYPE \n", |
| "cursor = ag.execCypher(\"MATCH (n:Person {name: %s}) SET n.title=%s RETURN n.title\", cols=[\"a VARCHAR\"], params=('Smith','Manager',))\n", |
| "for row in cursor:\n", |
| " print(\"SET: \", row[0])\n", |
| "\n", |
| "\n", |
| "# Execution with one result as SQL TYPE \n", |
| "cursor = ag.execCypher(\"MATCH (n:Person {name: %s}) REMOVE n.title RETURN id(n)\", cols=[\"a BIGINT\"], params=('Smith',))\n", |
| "for row in cursor:\n", |
| " print(\"REMOVE Prop: \", row[0])\n", |
| "\n", |
| "# You must commit explicitly\n", |
| "ag.commit()\n" |
| ] |
| }, |
| { |
| "attachments": {}, |
| "cell_type": "markdown", |
| "id": "cf0f16c8-07d0-49b9-ba4f-3f9044cac9e7", |
| "metadata": {}, |
| "source": [ |
| "---\n", |
| "## Query Vertices\n", |
| "\n", |
| "> execCypher(cypherStmt:str, cols:list=None, params:tuple=None) \n", |
| "\n", |
| "### Single result column\n", |
| "\n", |
| "```\n", |
| "cursor = ag.execCypher(\"MATCH (n:Person {name: %s) RETURN n\", params('Andy',))\n", |
| "for row in cursor:\n", |
| " vertex = row[0]\n", |
| " print(vertex.id, vertex[\"name\"], vertex) # row has id, label, properties \n", |
| "```\n", |
| "\n", |
| "### Multi result columns\n", |
| "\n", |
| "```\n", |
| "cursor = ag.execCypher(\"MATCH (n:Person) RETURN label(n), n.name\", cols=['label VARCHAR', 'name'])\n", |
| "for row in cursor:\n", |
| " label = row[0]\n", |
| " name = row[1]\n", |
| " print(label, name) \n", |
| "```\n", |
| "\n", |
| "\n", |
| "### Vertex object has id, label attribute and __getitem__, __setitem__ for properties\n", |
| "```\n", |
| "vertex.id\n", |
| "vertex.label\n", |
| "vertex[\"property_name\"]\n", |
| "```" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 3, |
| "id": "4cd66088-2c74-449e-88bc-76877779c86d", |
| "metadata": {}, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "-- Query Vertices --------------------\n", |
| "844424930131969 Person Joe\n", |
| "--> {label:Person, id:844424930131969, properties:{name: Joe}}::VERTEX\n", |
| "844424930131971 Person Jack\n", |
| "--> {label:Person, id:844424930131971, properties:{name: Jack}}::VERTEX\n", |
| "844424930131972 Person Andy\n", |
| "--> {label:Person, id:844424930131972, properties:{name: Andy, title: Developer}}::VERTEX\n", |
| "844424930131970 Person Smith\n", |
| "--> {label:Person, id:844424930131970, properties:{name: Smith}}::VERTEX\n", |
| "-- Query Vertices with with multi columns. --------------------\n", |
| "\"Person\" Joe\n", |
| "\"Person\" Jack\n", |
| "\"Person\" Andy\n", |
| "\"Person\" Smith\n" |
| ] |
| } |
| ], |
| "source": [ |
| "\n", |
| "# Query Vertices with parsed row cursor.\n", |
| "print(\"-- Query Vertices --------------------\")\n", |
| "cursor = ag.execCypher(\"MATCH (n:Person) RETURN n\")\n", |
| "for row in cursor:\n", |
| " vertex = row[0]\n", |
| " print(vertex.id, vertex.label, vertex[\"name\"])\n", |
| " print(\"-->\", vertex)\n", |
| "\n", |
| "# Query Vertices with with multi column\n", |
| "print(\"-- Query Vertices with with multi columns. --------------------\")\n", |
| "cursor = ag.execCypher(\"MATCH (n:Person) RETURN label(n), n.name\", cols=['label VARCHAR', 'name'])\n", |
| "for row in cursor:\n", |
| " label = row[0]\n", |
| " name = row[1]\n", |
| " print(label, name) \n" |
| ] |
| }, |
| { |
| "attachments": {}, |
| "cell_type": "markdown", |
| "id": "0a8606b5-8583-49f9-aa39-a1ac3e90d542", |
| "metadata": {}, |
| "source": [ |
| "---\n", |
| "## Create Relation \n", |
| "\n", |
| "> execCypher(cypherStmt:str, commit:bool, *args)\n", |
| "\n", |
| "\n", |
| "```\n", |
| "# Execute statement and handle results\n", |
| "cursor = ag.execCypher(\"MATCH (a:Person), (b:Person) WHERE a.name = %s AND b.name = %s CREATE p=((a)-[r:workWith]->(b)) RETURN p\", False, ('Andy', 'Smith',))\n", |
| "...\n", |
| "# You can access the results in cursor\n", |
| "...\n", |
| "ag.commit() # commit\n", |
| "```\n", |
| "\n", |
| "```\n", |
| "# Auto commit\n", |
| "ag.execCypher(\"MATCH (a:Person), (b:Person) WHERE a.name = 'Andy' AND b.name = 'Tom' CREATE (a)-[r:workWith]->(b)\", True)\n", |
| "\n", |
| "```\n" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 4, |
| "id": "0f904526-59d7-4025-9878-15e458bc5b56", |
| "metadata": {}, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "[{label:Person, id:844424930131972, properties:{name: Andy, title: Developer}}::VERTEX,{label:workWith, id:1125899906842627, properties:{}, start_id:844424930131972, end_id:844424930131970}::EDGE,{label:Person, id:844424930131970, properties:{name: Smith}}::VERTEX]::PATH\n", |
| "(a) {label:Person, id:844424930131969, properties:{name: Joe}}::VERTEX : (r) {label:workWith, id:1125899906842628, properties:{weight: 5}, start_id:844424930131969, end_id:844424930131971}::EDGE : (b) {label:Person, id:844424930131971, properties:{name: Jack}}::VERTEX\n" |
| ] |
| } |
| ], |
| "source": [ |
| "\n", |
| "# Create Edges\n", |
| "ag.execCypher(\"MATCH (a:Person), (b:Person) WHERE a.name = 'Joe' AND b.name = 'Smith' CREATE (a)-[r:workWith {weight: 3}]->(b)\")\n", |
| "ag.execCypher(\"MATCH (a:Person), (b:Person) WHERE a.name = 'Andy' AND b.name = 'Tom' CREATE (a)-[r:workWith {weight: 1}]->(b)\")\n", |
| "ag.execCypher(\"MATCH (a:Person {name: 'Jack'}), (b:Person {name: 'Andy'}) CREATE (a)-[r:workWith {weight: 5}]->(b)\")\n", |
| "\n", |
| "ag.commit()\n", |
| "\n", |
| "# With Params and Return\n", |
| "cursor = ag.execCypher(\"\"\"MATCH (a:Person), (b:Person) \n", |
| " WHERE a.name = %s AND b.name = %s \n", |
| " CREATE p=((a)-[r:workWith]->(b)) \n", |
| " RETURN p\"\"\", \n", |
| " params=('Andy', 'Smith',))\n", |
| "\n", |
| "for row in cursor:\n", |
| " print(row[0])\n", |
| "\n", |
| "ag.commit()\n", |
| "\n", |
| "# With many columns Return\n", |
| "cursor = ag.execCypher(\"\"\"MATCH (a:Person {name: 'Joe'}), (b:Person {name: 'Jack'}) \n", |
| " CREATE (a)-[r:workWith {weight: 5}]->(b) \n", |
| " RETURN a, r, b \"\"\", cols=['a','r', 'b'])\n", |
| "\n", |
| "for row in cursor:\n", |
| " print(\"(a)\", row[0], \": (r)\", row[1], \": (b)\", row[2])\n", |
| " \n", |
| "\n", |
| "ag.commit()\n", |
| "\n", |
| " " |
| ] |
| }, |
| { |
| "attachments": {}, |
| "cell_type": "markdown", |
| "id": "2615465d-9cff-4e67-9935-21344df4574c", |
| "metadata": {}, |
| "source": [ |
| "---\n", |
| "## Query Relations\n", |
| "\n", |
| "> With single column\n", |
| "```\n", |
| "cursor = ag.execCypher(\"MATCH p=()-[:workWith]-() RETURN p\")\n", |
| "for row in cursor:\n", |
| " path = row[0]\n", |
| " print(path) \n", |
| "```\n", |
| "\n", |
| "> With multi columns\n", |
| "```\n", |
| "cursor = ag.execCypher(\"MATCH p=(a)-[b]-(c) RETURN a,label(b),c\", cols=[\"a\",\"b VARCHAR\",\"c\"])\n", |
| "for row in cursor:\n", |
| " start = row[0]\n", |
| " edge = row[1]\n", |
| " end = row[2]\n", |
| " print(start[\"name\"] , edge.label, end[\"name\"]) \n", |
| "```\n", |
| "\n", |
| "\n", |
| "### Edge object has id, label,start_id, end_id attribute and __getitem__, __setitem__ for properties\n", |
| "```\n", |
| "edge = path.rel\n", |
| "edge.id\n", |
| "edge.label\n", |
| "edge.start_id\n", |
| "edge.end_id\n", |
| "edge[\"property_name\"]\n", |
| "edge.properties\n", |
| "```" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 7, |
| "id": "7673e270-4ea3-4878-961c-8fc97106e1bd", |
| "metadata": {}, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "START: {label:Person, id:844424930131971, properties:{name: Jack}}::VERTEX\n", |
| "EDGE: {label:workWith, id:1125899906842628, properties:{weight: 5}, start_id:844424930131969, end_id:844424930131971}::EDGE\n", |
| "END: {label:Person, id:844424930131969, properties:{name: Joe}}::VERTEX\n", |
| "START: {label:Person, id:844424930131970, properties:{name: Smith}}::VERTEX\n", |
| "EDGE: {label:workWith, id:1125899906842625, properties:{weight: 3}, start_id:844424930131969, end_id:844424930131970}::EDGE\n", |
| "END: {label:Person, id:844424930131969, properties:{name: Joe}}::VERTEX\n", |
| "START: {label:Person, id:844424930131969, properties:{name: Joe}}::VERTEX\n", |
| "EDGE: {label:workWith, id:1125899906842628, properties:{weight: 5}, start_id:844424930131969, end_id:844424930131971}::EDGE\n", |
| "END: {label:Person, id:844424930131971, properties:{name: Jack}}::VERTEX\n", |
| "START: {label:Person, id:844424930131972, properties:{name: Andy, title: Developer}}::VERTEX\n", |
| "EDGE: {label:workWith, id:1125899906842626, properties:{weight: 5}, start_id:844424930131971, end_id:844424930131972}::EDGE\n", |
| "END: {label:Person, id:844424930131971, properties:{name: Jack}}::VERTEX\n", |
| "START: {label:Person, id:844424930131971, properties:{name: Jack}}::VERTEX\n", |
| "EDGE: {label:workWith, id:1125899906842626, properties:{weight: 5}, start_id:844424930131971, end_id:844424930131972}::EDGE\n", |
| "END: {label:Person, id:844424930131972, properties:{name: Andy, title: Developer}}::VERTEX\n", |
| "START: {label:Person, id:844424930131970, properties:{name: Smith}}::VERTEX\n", |
| "EDGE: {label:workWith, id:1125899906842627, properties:{}, start_id:844424930131972, end_id:844424930131970}::EDGE\n", |
| "END: {label:Person, id:844424930131972, properties:{name: Andy, title: Developer}}::VERTEX\n", |
| "START: {label:Person, id:844424930131969, properties:{name: Joe}}::VERTEX\n", |
| "EDGE: {label:workWith, id:1125899906842625, properties:{weight: 3}, start_id:844424930131969, end_id:844424930131970}::EDGE\n", |
| "END: {label:Person, id:844424930131970, properties:{name: Smith}}::VERTEX\n", |
| "START: {label:Person, id:844424930131972, properties:{name: Andy, title: Developer}}::VERTEX\n", |
| "EDGE: {label:workWith, id:1125899906842627, properties:{}, start_id:844424930131972, end_id:844424930131970}::EDGE\n", |
| "END: {label:Person, id:844424930131970, properties:{name: Smith}}::VERTEX\n", |
| "-- [Query path with multi columns --------\n", |
| "Jack workWith 5 Joe\n", |
| "Smith workWith 3 Joe\n", |
| "Joe workWith 5 Jack\n", |
| "Andy workWith 5 Jack\n", |
| "Jack workWith 5 Andy\n", |
| "Joe workWith 3 Smith\n" |
| ] |
| } |
| ], |
| "source": [ |
| "cursor = ag.execCypher(\"MATCH p=()-[:workWith]-() RETURN p\")\n", |
| "for row in cursor:\n", |
| " path = row[0]\n", |
| " print(\"START:\", path[0])\n", |
| " print(\"EDGE:\", path[1])\n", |
| " print(\"END:\", path[2]) \n", |
| "\n", |
| "print(\"-- [Query path with multi columns --------\")\n", |
| "cursor = ag.execCypher(\"MATCH p=(a)-[b]-(c) WHERE b.weight>%s RETURN a,label(b), b.weight, c\", cols=[\"a\",\"bl\",\"bw\", \"c\"], params=(2,))\n", |
| "for row in cursor:\n", |
| " start = row[0]\n", |
| " edgel = row[1]\n", |
| " edgew = row[2]\n", |
| " end = row[3]\n", |
| " print(start[\"name\"] , edgel, edgew, end[\"name\"]) \n", |
| "\n", |
| "\n", |
| " " |
| ] |
| }, |
| { |
| "attachments": {}, |
| "cell_type": "markdown", |
| "id": "22690e1d-f258-4f2f-87b2-4f5b0a7f4574", |
| "metadata": {}, |
| "source": [ |
| "---\n", |
| "## Query COLLECT\n" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 8, |
| "id": "5771219a", |
| "metadata": {}, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "Joe workWith ['Jack', 'Smith']\n", |
| "Smith workWith ['Joe', 'Andy']\n", |
| "Jack workWith ['Joe', 'Andy']\n", |
| "Andy workWith ['Jack', 'Smith']\n", |
| "Joe workWith ['Jack', 'Smith']\n", |
| "Smith workWith ['Joe', 'Andy']\n", |
| "Jack workWith ['Joe', 'Andy']\n", |
| "Andy workWith ['Jack', 'Smith']\n" |
| ] |
| } |
| ], |
| "source": [ |
| "\n", |
| "with ag.connection.cursor() as cursor:\n", |
| " ag.cypher(cursor, \"MATCH (a)-[:workWith]-(c) WITH a as V, COLLECT(c) as CV RETURN V.name, CV\", cols=[\"V\",\"CV\"])\n", |
| " for row in cursor:\n", |
| " nm = row[0]\n", |
| " collected = row[1]\n", |
| " print(nm, \"workWith\", [i[\"name\"] for i in collected])\n", |
| "\n", |
| "for row in ag.execCypher(\"MATCH (a)-[:workWith]-(c) WITH a as V, COLLECT(c) as CV RETURN V.name, CV\", cols=[\"V1\",\"CV\"]):\n", |
| " nm = row[0]\n", |
| " collected = row[1]\n", |
| " print(nm, \"workWith\", [i[\"name\"] for i in collected])\n" |
| ] |
| }, |
| { |
| "attachments": {}, |
| "cell_type": "markdown", |
| "id": "ac4d3e0e-0101-40cd-bc9a-59386a1e4485", |
| "metadata": {}, |
| "source": [ |
| "--- \n", |
| "## Many executions in one transaction & Multiple Edges" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 9, |
| "id": "c8b36687-c842-4663-a7aa-084ae618301e", |
| "metadata": {}, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| " Country USA\n", |
| " > distance 4760 miles\n", |
| " > > Country France\n", |
| " > > > distance 9228 km\n", |
| " > > > > Country Korea\n" |
| ] |
| } |
| ], |
| "source": [ |
| "with ag.connection.cursor() as cursor:\n", |
| " try :\n", |
| " ag.cypher(cursor, \"CREATE (n:Country {name: %s}) \", params=('USA',))\n", |
| " ag.cypher(cursor, \"CREATE (n:Country {name: %s}) \", params=('France',))\n", |
| " ag.cypher(cursor, \"CREATE (n:Country {name: %s}) \", params=('Korea',))\n", |
| " ag.cypher(cursor, \"CREATE (n:Country {name: %s}) \", params=('Russia',))\n", |
| "\n", |
| " # You must commit explicitly after all executions.\n", |
| " ag.connection.commit()\n", |
| " except Exception as ex:\n", |
| " ag.rollback()\n", |
| " raise ex\n", |
| "\n", |
| "with ag.connection.cursor() as cursor:\n", |
| " try :# Create Edges\n", |
| " ag.cypher(cursor,\"MATCH (a:Country), (b:Country) WHERE a.name = 'USA' AND b.name = 'France' CREATE (a)-[r:distance {unit:'miles', value: 4760}]->(b)\")\n", |
| " ag.cypher(cursor,\"MATCH (a:Country), (b:Country) WHERE a.name = 'France' AND b.name = 'Korea' CREATE (a)-[r:distance {unit: 'km', value: 9228}]->(b)\")\n", |
| " ag.cypher(cursor,\"MATCH (a:Country {name: 'Korea'}), (b:Country {name: 'Russia'}) CREATE (a)-[r:distance {unit:'km', value: 3078}]->(b)\")\n", |
| "\n", |
| " # You must commit explicitly\n", |
| " ag.connection.commit()\n", |
| " except Exception as ex:\n", |
| " ag.rollback()\n", |
| " raise ex\n", |
| "\n", |
| "\n", |
| "cursor = ag.execCypher(\"\"\"MATCH p=(:Country {name:\"USA\"})-[:distance]-(:Country)-[:distance]-(:Country) \n", |
| " RETURN p\"\"\")\n", |
| "\n", |
| "for row in cursor:\n", |
| " path = row[0]\n", |
| " indent = \"\"\n", |
| " for e in path:\n", |
| " if e.gtype == age.TP_VERTEX:\n", |
| " print(indent, e.label, e[\"name\"])\n", |
| " elif e.gtype == age.TP_EDGE:\n", |
| " print(indent, e.label, e[\"value\"], e[\"unit\"])\n", |
| " else:\n", |
| " print(indent, \"Unknown element.\", e)\n", |
| " \n", |
| " indent += \" >\"\n" |
| ] |
| }, |
| { |
| "attachments": {}, |
| "cell_type": "markdown", |
| "id": "f502e0db-a603-4eb9-90e8-dac2c9edd1d4", |
| "metadata": {}, |
| "source": [ |
| "---\n", |
| "## Query Scalar or properties value" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 10, |
| "id": "7f93e698-888a-4dde-b327-e591659e051f", |
| "metadata": {}, |
| "outputs": [ |
| { |
| "name": "stdout", |
| "output_type": "stream", |
| "text": [ |
| "-- Query scalar value --------------------\n", |
| "844424930131969\n", |
| "844424930131971\n", |
| "844424930131972\n", |
| "844424930131970\n", |
| "-- Query properties --------------------\n", |
| "{'name': 'Joe'}\n", |
| "{'name': 'Jack'}\n", |
| "{'name': 'Andy', 'title': 'Developer'}\n", |
| "{'name': 'Smith'}\n", |
| "-- Query property value --------------------\n", |
| "Developer\n" |
| ] |
| } |
| ], |
| "source": [ |
| "# Query scalar value\n", |
| "print(\"-- Query scalar value --------------------\")\n", |
| "for row in ag.execCypher(\"MATCH (n:Person) RETURN id(n)\"):\n", |
| " print(row[0])\n", |
| " \n", |
| "# Query properties \n", |
| "print(\"-- Query properties --------------------\")\n", |
| "\n", |
| "for row in ag.execCypher(\"MATCH (n:Person) RETURN properties(n)\"):\n", |
| " print(row[0])\n", |
| " \n", |
| "# Query properties value\n", |
| "print(\"-- Query property value --------------------\")\n", |
| "for row in ag.execCypher(\"MATCH (n:Person {name: 'Andy'}) RETURN n.title\"):\n", |
| " print(row[0])\n", |
| " \n", |
| " " |
| ] |
| }, |
| { |
| "attachments": {}, |
| "cell_type": "markdown", |
| "id": "8ce0a003-b038-4334-9de8-111569549040", |
| "metadata": {}, |
| "source": [ |
| "## Close connection" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 11, |
| "id": "e15b0654-66d2-4da4-af66-6f776e6729ac", |
| "metadata": {}, |
| "outputs": [], |
| "source": [ |
| "# Clear test data\n", |
| "age.deleteGraph(ag.connection, GRAPH_NAME)\n", |
| "# connection close\n", |
| "ag.close()" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": null, |
| "id": "40e4d7a4-4009-4c42-892c-93cde00762d2", |
| "metadata": {}, |
| "outputs": [], |
| "source": [] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": null, |
| "id": "ab18f5f5-84d3-439f-aa82-53ccfd569d31", |
| "metadata": {}, |
| "outputs": [], |
| "source": [] |
| } |
| ], |
| "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.9.2" |
| } |
| }, |
| "nbformat": 4, |
| "nbformat_minor": 5 |
| } |