In [1]:
"""
Property Graph Example using Neo4j
This script accompanies Section 3 of the chapter on Property Graphs.
Requirements
------------
pip install neo4j tabulate
Update the URI, username, and password below before running.
"""
Out[1]:
'\nProperty Graph Example using Neo4j\n\nThis script accompanies Section 3 of the chapter on Property Graphs.\n\nRequirements\n------------\npip install neo4j tabulate\n\nUpdate the URI, username, and password below before running.\n'
In [2]:
from neo4j import GraphDatabase
from tabulate import tabulate
Connection information¶
In [3]:
URI = "bolt://localhost:7687"
AUTH = ("" , "" )
driver = GraphDatabase.driver(
URI,
auth=AUTH
)
Utility routine¶
In [4]:
def run_query(query):
print("=" * 72)
print("neo4j>")
print(query.strip())
print()
with driver.session() as session:
result = session.run(query)
records = list(result)
columns = result.keys()
if columns:
rows = [[record[c] for c in columns] for record in records]
print(tabulate(rows,
headers=columns,
tablefmt="github"))
else:
summary = result.consume()
c = summary.counters
print("Summary")
print("-------")
if c.nodes_created:
print(f"Nodes created: {c.nodes_created}")
if c.relationships_created:
print(f"Relationships created: {c.relationships_created}")
if c.properties_set:
print(f"Properties set: {c.properties_set}")
print()
Clean database¶
In [5]:
run_query("""
MATCH (n)
DETACH DELETE n
""")
======================================================================== neo4j> MATCH (n) DETACH DELETE n Summary -------
Create nodes We are using the design in Figure 3¶
In [6]:
run_query("""
CREATE
(art:Person {name:'art'}),
(bob:Person {name:'bob'}),
(bea:Person {name:'bea', age:23}),
(cal:Person {name:'cal'}),
(cam:Person {name:'cam'}),
(coe:Person {name:'coe'}),
(cory:Person {name:'cory'}),
(seattle:City {name:'seattle'})
""")
========================================================================
neo4j>
CREATE
(art:Person {name:'art'}),
(bob:Person {name:'bob'}),
(bea:Person {name:'bea', age:23}),
(cal:Person {name:'cal'}),
(cam:Person {name:'cam'}),
(coe:Person {name:'coe'}),
(cory:Person {name:'cory'}),
(seattle:City {name:'seattle'})
Summary
-------
Nodes created: 8
Properties set: 9
Create relationships¶
In [7]:
run_query("""
MATCH
(art:Person {name:'art'}),
(bob:Person {name:'bob'}),
(bea:Person {name:'bea'}),
(cal:Person {name:'cal'}),
(cam:Person {name:'cam'}),
(coe:Person {name:'coe'}),
(cory:Person {name:'cory'}),
(seattle:City {name:'seattle'})
CREATE
(art)-[:KNOWS {since:2005}]->(bob),
(art)-[:KNOWS {since:2012}]->(bea),
(bob)-[:KNOWS]->(cal),
(bob)-[:KNOWS]->(cam),
(bea)-[:KNOWS]->(coe),
(bea)-[:KNOWS]->(cory),
(bea)-[:BASED_NEAR]->(seattle)
""")
========================================================================
neo4j>
MATCH
(art:Person {name:'art'}),
(bob:Person {name:'bob'}),
(bea:Person {name:'bea'}),
(cal:Person {name:'cal'}),
(cam:Person {name:'cam'}),
(coe:Person {name:'coe'}),
(cory:Person {name:'cory'}),
(seattle:City {name:'seattle'})
CREATE
(art)-[:KNOWS {since:2005}]->(bob),
(art)-[:KNOWS {since:2012}]->(bea),
(bob)-[:KNOWS]->(cal),
(bob)-[:KNOWS]->(cam),
(bea)-[:KNOWS]->(coe),
(bea)-[:KNOWS]->(cory),
(bea)-[:BASED_NEAR]->(seattle)
Summary
-------
Relationships created: 7
Properties set: 2
Query 1¶
In [8]:
run_query("""
MATCH (p1:Person {name:'art'})-[:KNOWS]->(p2:Person)
RETURN p2.name AS Friend
""")
========================================================================
neo4j>
MATCH (p1:Person {name:'art'})-[:KNOWS]->(p2:Person)
RETURN p2.name AS Friend
| Friend |
|----------|
| bob |
| bea |
Query 2¶
In [9]:
run_query("""
MATCH (p1:Person {name:'art'})-[r:KNOWS {since:2010}]->(p2:Person)
RETURN p2.name AS Friend
""")
========================================================================
neo4j>
MATCH (p1:Person {name:'art'})-[r:KNOWS {since:2010}]->(p2:Person)
RETURN p2.name AS Friend
| Friend |
|----------|
Query 3¶
In [10]:
run_query("""
MATCH (p1:Person {name:'art'})-[r:KNOWS]->(p2:Person)
WHERE r.since <= 2010
RETURN p2.name AS Friend
""")
========================================================================
neo4j>
MATCH (p1:Person {name:'art'})-[r:KNOWS]->(p2:Person)
WHERE r.since <= 2010
RETURN p2.name AS Friend
| Friend |
|----------|
| bob |
Query 4¶
In [11]:
run_query("""
MATCH (p:Person {name:'bea'})-[:BASED_NEAR]->(c:City)
RETURN c.name AS City
""")
========================================================================
neo4j>
MATCH (p:Person {name:'bea'})-[:BASED_NEAR]->(c:City)
RETURN c.name AS City
| City |
|---------|
| seattle |
In [12]:
driver.close()