Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Â
Morpheus - SQL and Cypher in Apache Spark
1. Morpheus
SQL and CypherÂŽ
in ApacheÂŽ
Spark
Extending Apache Spark Graph for the Enterprise
with Morpheus and Neo4j
Martin Junghanns
Software Engineer
Graph Analytics Team
7. Property Graphs
Node
â Represents an entity within the graph
â Can have labels
Relationship
â Connects a start node with an end node
â Has one type
Property
â Describes a node/relationship: e.g. name, age, weight etc
â Key-value pair: String key; typed value (string, number, bool, list, ...)
9. The OLTP / OLAP landscape
Tables Graphs
Transactional
PostgreSQL,
Oracle,
SQLServer
Neo4j
Data
Integration
& Analytics Spark SQL Morpheus
10. Graphs in Spark and Neo4j
Spark is an immutable data processing engine
⢠Spark graphs are compositions of tables (DFs)
⢠Spark graphs can be transformed and combined
⢠Functions (including queries) over multiple graphs
⢠Cypher query plans mapped to Catalyst
Neo4j is a native transactional CRUD database
⢠Neo4j graphs use a native graph data representation
⢠Neo4j has optimized in-process MT graph algos
⢠Morpheus helps move data in and out of Neo4j
11. Morpheus: SQL + Cypher in one session
Graphs and tables are both useful data models
⢠Finding paths and subgraphs, and transforming graphs
⢠Viewing, aggregating and ordering values
The Morpheus project parallels Spark SQL
⢠PropertyGraph type (composed of DataFrames)
⢠Catalog of graph data sources, named graphs, views,
⢠Cypher query language
A CypherSession adds graphs to a SparkSession
12. What is Morpheus used for?
⢠Data integration
⢠Integrate (non-)graphy data from multiple, heterogeneous data sources
into one or more property graphs
⢠Distributed Cypher execution
⢠OLAP-style graph analytics
⢠Data science
⢠Integration with other Spark libraries
⢠Feature extraction using Neo4j Graph Algorithms
13. Graph Algorithms
PathďŹnding
& Search
Centrality /
Importance
Community
Detection
Link
Prediction
Finds optimal paths
or evaluates route
availability and quality
Determines the
importance of distinct
nodes in the network
Detects group
clustering or partition
options
Evaluates how
alike nodes are
Estimates the likelihood
of nodes forming a
future relationship
Similarity
20. Query engine architecture
â Distributed executionSpark Core
Spark SQL
â Rule- and Cost-based query
optimization via Catalyst
MATCH (c:Captain)-[:COMMANDS]->(s:Ship)
WHERE c.name = âMorpheusâ
RETURN c.name, s.name
openCypher
Frontend
â Parsing, Rewriting, Normalization
â Semantic Analysis (Scoping,
Typing, etc.)
Morpheus
â Data Import and Export
â Schema and Type handling
â Query translation to Spark
operations
Relational
Planning
Logical
Planning
Spark
Backend
â Translation into Logical
Operators
â Basic Logical Optimization
â Backend Agnostic Query
Representation
â Conversion and typing of
Frontend expressions
â Translation into Relational
Operations on abstract
tables
â Column layout computation
Intermediate
Language
â Spark-speciďŹc table
implementation
21. âTables for Labelsâ
⢠In Morpheus, PropertyGraphs are represented by
⢠Node Tables and Relationship Tables
⢠Tables are represented by DataFrames
⢠Require a fixed schema
⢠Property Graphs have a Graph Type
⢠Node and relationship types that occur in the graph
⢠Node and relationship properties and their data type
Property Graph
Node Tables
Rel. Tables
Graph Type
22. âTables for Labelsâ
:Captain:Person
name: Morpheus
:Ship
name: Nebuchadnezzar
:COMMANDS
id name
0 Morpheus
id name
1 Nebuchadnezzar
id source target
0 0 1
:Captain:Person
:Ship
:COMMANDS
Graph Type {
:Captain:Person (
name: STRING
),
:Ship (
name: STRING
),
:COMMANDS
}
25. Cypher query language
Cypher 9 is the latest full version of openCypher
⢠Implemented in Neo4j 3.5
⢠Includes date/time types and functions
⢠Implemented in whole/part by six other vendors
⢠Several other partial and research implementations
⢠Cypher for Gremlin is another openCypher project
26. Cypher 9 support in Morpheus
Cypher is a full CRUD language â OLTP database
⢠RETURNs only tabular results: not composable
⢠Results can include graph elements (paths, relationships, nodes) or
property values
Morpheus implements most of read-only Cypher
⢠No MERGE or DELETE
⢠Spark immutable data + transformations
27. Cypher 10 in Morpheus - Multiple graphs
Cypher 10 proposes Multiple Graph features
⢠Multiple Graph CIP: https://git.io/fjmrx
Allows for Cypher Query composition
⢠Similar to chaining transformations on DataFrames
Support Graph Catalog for managing Graphs
⢠Analogous to Spark SQL catalog
Query support for Graph Construction
28. Returning tabular data Input: a property graph
Output: a table
FROM GRAPH socialNetwork
MATCH ({name: 'Dan'})-[:FRIEND*2]->(foaf)
RETURN toUpper(foaf.name) AS name
ORDER BY name DESC
Language features available in Morpheus
29. Constructing graphs Input: a property graph
Output: a property graph
FROM GRAPH socialNetwork
MATCH (p:Person)-[:FRIEND*2]->(foaf)
WHERE NOT (p)-[:FRIEND]->(foaf)
CONSTRUCT
CREATE (p)-[:POSSIBLE_FRIEND]->(foaf)
RETURN GRAPH
Language features available in Morpheus
30. Querying multiple graphs Input: property graphs
Output: a property graph
FROM GRAPH socialNetwork
MATCH (p:Person)
FROM GRAPH products
MATCH (c:Customer)
WHERE p.email = c.email
CONSTRUCT ON socialNetwork, products
CREATE (p)-[:IS]->(c)
RETURN GRAPH
Language features available in Morpheus
31. Creating graph views Input: property graphs
Output: a property graph
CATALOG CREATE VIEW youngFriends($inGraph){
FROM GRAPH $inGraph
MATCH (p1:Person)-[r]->(p2:Person)
WHERE p1.age < 25 AND p2.age < 25
CONSTRUCT
CREATE (p1)-[COPY OF r]->(p2)
RETURN GRAPH
}
Language features available in Morpheus
32. Using graph views Input: property graphs
Output: table or graph
FROM youngFriends(socialNetwork)
MATCH (p:Person)-[r]->(o)
RETURN p, r, o
// and views over views
FROM youngFriends(europe(socialNetwork))
MATCH ...
Language features available in Morpheus
34. Demo Big Picture
Part 1
From JSON to Graph
Create persistent
Property Graph from
raw Yelp dataset
Read Yelp Data from
JSON into DataFrames
Create Property Graph
from DataFrames
Store Property Graph
using Parquet
Part 2
A library of Graphs
Create a library of
graph projections
Read Property Graph
from Parquet
Create subgraph for a
specifc city
Project and persist city
subgraph
Part 3
Federated queries
Integrate reviews with
social network data
DeďŹne Graph Type and
Mapping with Graph
DDL
Load data from Hive
and H2
Run analytical query on
the integrated graph
Part 5
Neo4j Integration II
Recommend
businesses to users
Load graph projections
from library
Write graphs to Neo4j,
run Louvain + Jaccard
Run analytical query in
Morpheus to ďŹnd
recommendations
Part 4
Neo4j Integration I
Find trending
businesses
Load graph projections
from library
Write graphs to Neo4j
and run PageRank
Combine graphs in
Morpheus and select
trending businesses
https://git.io/fjZ2b
35. The Yelp Open Dataset
⢠Yelp is a search service based on crowd-sourced reviews about local
businesses
⢠The Yelp Open Dataset is part of the Yelp Dataset Challenge
⢠Yelpsâ effort to encourage researchers to explore the dataset
⢠~150K businesses, 10M users, 5M reviews, 35M friendships
https://www.yelp.com
https://www.yelp.com/dataset
https://www.yelp.com/dataset/challenge
36. The Yelp Open Dataset
:Business
name : ACME
address : 123 ACME Rd.
city : San Jose
state : CA
:User
name : Alice
since : 2013
elite : [2014, 2016]
:User
name : Bob
since : 2014
elite : null
:REVIEWS
stars : 5
date : 2014-02-03
:REVIEWS
stars : 4
date : 2014-08-03
37. Part 1: From JSON to Graph
business.json
user.json
review.json
Create Node and
Relationship Tables
Create Property Graph Store Property Graph
https://git.io/fjZ2N
38. From DataFrame to NodeTable
// (:User)
val userDataFrame = spark.read.json(...).select(...)
val userNodeTable = MorpheusElementTable.create(NodeMappingBuilder.on("id")
.withImpliedLabel("User")
.withPropertyKey("name")
.withPropertyKey("yelping_since")
.withPropertyKey("elite")
.build, userDataFrame)
id name yelping_since elite
0 Alice 2013 [2014, 2016]
1 Bob 2014 null
40. Managing multiple graphs
⢠Property Graphs are managed within a catalog
Cypher Session
Property Graph Catalog
Property Graph Data Source <namespace>
Property Graph <name>
QualiďŹedGraphName = <namespace>.<name>
41. Cypher Session
⢠API to operate with the query engine and the catalog
trait CypherSession {
def cypher(
query: String,
parameters: CypherMap = CypherMap.empty,
drivingTable: Option[CypherRecords] = None
): Result
def catalog: PropertyGraphCatalog
}
42. Property Graph Catalog
⢠API to manage multiple Property Graphs
⢠Catalog functions can be executed via Cypher or Scala API
trait PropertyGraphCatalog {
def register(namespace: Namespace, dataSource: PropertyGraphDataSource): Unit
def store(qualifiedGraphName: QualifiedGraphName, graph: PropertyGraph): Unit
def graph(qualifiedGraphName: QualifiedGraphName): PropertyGraph
def drop(qualifiedGraphName: QualifiedGraphName): Unit
// additional methods for managing views, listing namespaces and graphs
}
43. Property Graph Data Source (PGDS)
⢠API for loading and saving property graphs
trait PropertyGraphDataSource {
def hasGraph(name: GraphName): Boolean
def graph(name: GraphName): PropertyGraph
def schema(name: GraphName): Option[Schema]
// additional methods for storing, deleting, listing graphs
}
44. PGDS implementations in Morpheus
PGDS Multiple graphs Read graphs Write graphs
File-based
Parquet, ORC, CSV
HDFS, local, S3
Yes Yes Yes
SQL
Hive, Jdbc
Yes Yes No
Neo4j Bolt Yes Yes Yes
Neo4j Bulk Import No No Yes
46. Read from single Property Graph
Cypher Session
Property Graph Catalog
âsocial-netâ (Neo4j PGDS)
âUSâ (Property Graph)
FROM social-net.US
MATCH (p:Person)
RETURN p
47. Read from multiple Property Graphs
Cypher Session
Property Graph Catalog
âsocial-netâ (Neo4j PGDS)
âUSâ
âEUâ
âproductsâ (SQL PGDS)
â2018â
â2017â
FROM social-net.US
MATCH (p:Person)
FROM products.2018
MATCH (c:Customer)
WHERE p.email = c.email
RETURN p, c
48. Construct new Property Graphs
Cypher Session
Property Graph Catalog
âsocial-netâ (Neo4j PGDS)
âUSâ
âEUâ
âproductsâ (SQL PGDS)
â2018â
â2017â
CATALOG CREATE GRAPH social-net.US_new {
FROM social-net.US
MATCH (p:Person)
FROM products.2018
MATCH (c:Customer)
WHERE p.email = c.email
CONSTRUCT ON social-net.US
CREATE (p)-[:SAME_AS]->(c)
RETURN GRAPH
}
49. Construct new Property Graphs
CATALOG CREATE GRAPH social-net.US_new {
FROM social-net.US
MATCH (p:Person)
FROM products.2018
MATCH (c:Customer)
WHERE p.email = c.email
CONSTRUCT ON social-net.US
CREATE (p)-[:SAME_AS]->(c)
RETURN GRAPH
}
Cypher Session
Property Graph Catalog
âsocial-netâ (Neo4j PGDS)
âUSâ
âEUâ
âproductsâ (SQL PGDS)
â2018â
â2017â
âUS_newâ
50. Create and query Graph Views
Cypher Session
Property Graph Catalog
âsocial-netâ (Neo4j PGDS)
âUSâ
âEUâ
...
CATALOG CREATE VIEW youngPeople($sn) {
FROM $sn
MATCH (p:Person)-[r]->(n)
WHERE p.age < 21
CONSTRUCT
CREATE (p)-[COPY OF r]->(n)
RETURN GRAPH
}
FROM youngPeople(social-net.US)
MATCH (p:Person)
RETURN p
âyoungPeopleâ
Views
51. Demo Big Picture
Part 1
From JSON to Graph
Create persistent
Property Graph from
raw Yelp dataset
Read Yelp Data from
JSON into DataFrames
Create Property Graph
from DataFrames
Store Property Graph
using Parquet
Part 2
A library of Graphs
Create a library of
graph projections
Read Property Graph
from Parquet
Create subgraph for a
specifc city
Project and persist city
subgraph
Part 3
Federated queries
Integrate reviews with
social network data
DeďŹne Graph Type and
Mapping with Graph
DDL
Load data from Hive
and H2
Run analytical query on
the integrated graph
Part 5
Neo4j Integration II
Recommend
businesses to users
Load graph projections
from library
Write graphs to Neo4j,
run Louvain + Jaccard
Run analytical query in
Morpheus to ďŹnd
recommendations
Part 4
Neo4j Integration I
Find trending
businesses
Load graph projections
from library
Write graphs to Neo4j
and run PageRank
Combine graphs in
Morpheus and select
trending businesses
https://git.io/fjZ2b
52. Reminder: The Yelp Open Dataset
:Business
name : ACME
address : 123 ACME Rd.
city : San Jose
state : CA
:User
name : Alice
since : 2013
elite : [2014, 2016]
:User
name : Bob
since : 2014
elite : null
:REVIEWS
stars : 5
date : 2014-02-03
:REVIEWS
stars : 4
date : 2014-08-03
53. 2015 - 2018
Part 2: Building a library of graphs
https://git.io/fjZ25
Boulder City
(:User)-[:CO_REVIEWS]->(:User)
(:User)-[:REVIEWS]->(:Business)
(:User)-[:CO_REVIEWS]->(:User)
Constuct graphs for each year
Extract Yelp
subgraph for
speciďŹc city
(:Business)-[:CO_REVIEWED]->(:Business)
55. PGDS on Steroids: The SQL PGDS
JDBC
Hive
Oracle
SQL Server
Orc
Parquet
Table/View
Table/View
Table/View
...
...
Graph DDL
Graph Instance
- Table mappings
SQL Tables Property Graphs
Property Graph
Node Tables
Rel. Tables
Graph Type
SQL Property Graph
Data Source
Spark SQL
Data Sources
Graph Type
- Element types
- Node types
- Relationship types
56. Demo Big Picture
Part 1
From JSON to Graph
Create persistent
Property Graph from
raw Yelp dataset
Read Yelp Data from
JSON into DataFrames
Create Property Graph
from DataFrames
Store Property Graph
using Parquet
Part 2
A library of Graphs
Create a library of
graph projections
Read Property Graph
from Parquet
Create subgraph for a
specifc city
Project and persist city
subgraph
Part 3
Federated queries
Integrate reviews with
social network data
DeďŹne Graph Type and
Mapping with Graph
DDL
Load data from Hive
and H2
Run analytical query on
the integrated graph
Part 5
Neo4j Integration II
Recommend
businesses to users
Load graph projections
from library
Write graphs to Neo4j,
run Louvain + Jaccard
Run analytical query in
Morpheus to ďŹnd
recommendations
Part 4
Neo4j Integration I
Find trending
businesses
Load graph projections
from library
Write graphs to Neo4j
and run PageRank
Combine graphs in
Morpheus and select
trending businesses
https://git.io/fjZ2b
57. Reminder: The Yelp Open Dataset
:Business
name : ACME
address : 123 ACME Rd.
city : San Jose
state : CA
:User
name : Alice
since : 2013
elite : [2014, 2016]
email : alice@yelp.com
:User
name : Bob
since : 2014
elite : null
email : bob@yelp.com
:REVIEWS
stars : 5
date : 2014-02-03
:REVIEWS
stars : 4
date : 2014-08-03
59. Part 3: Integrating Yelp and YelpBook
Yelp Reviews
Yelp Book
Graph DDL
+
SQL PGDS
(:User)-[:REVIEWS]->(:Business)
(:User)-[:FRIEND]->(:User)
https://git.io/fjZ2p
60. CREATE GRAPH TYPE yelp (
-- Element types (concepts used to describe a graph)
User ( name STRING, since DATE ),
Business ( name STRING, city STRING ),
REVIEWS ( stars INTEGER, date LOCALDATETIME ),
FRIEND,
-- Node types
(User),
(Business),
-- Relationship types
(User)-[REVIEWS]->(Business),
(User)-[FRIEND]->(User)
)
Graph DDL: Graph Type definition
61. CREATE GRAPH yelp_and_yelpBook OF yelp (
-- Node type mappings
(User) FROM HIVE.yelp.user,
(Business) FROM HIVE.yelp.business,
-- Relationship type mappings
(User)-[REVIEWS]->(Business) FROM HIVE.yelp.review e
START NODES (User) FROM HIVE.yelp.user n JOIN e.user_email = n.email
END NODES (Business) FROM HIVE.yelp.business n JOIN e.business_id = n.business_id,
(User)-[FRIEND]->(User) FROM H2.yelpbook.friend e
START NODES (User) FROM HIVE.yelp.user n JOIN e.user1_email = n.email
END NODES (User) FROM HIVE.yelp.user n JOIN e.user2_email = n.email
)
Graph DDL: Graph Instance definition
68. Demo Big Picture
Part 1
From JSON to Graph
Create persistent
Property Graph from
raw Yelp dataset
Read Yelp Data from
JSON into DataFrames
Create Property Graph
from DataFrames
Store Property Graph
using Parquet
Part 2
A library of Graphs
Create a library of
graph projections
Read Property Graph
from Parquet
Create subgraph for a
specifc city
Project and persist city
subgraph
Part 3
Federated queries
Integrate reviews with
social network data
DeďŹne Graph Type and
Mapping with Graph
DDL
Load data from Hive
and H2
Run analytical query on
the integrated graph
Part 5
Neo4j Integration II
Recommend
businesses to users
Load graph projections
from library
Write graphs to Neo4j,
run Louvain + Jaccard
Run analytical query in
Morpheus to ďŹnd
recommendations
Part 4
Neo4j Integration I
Find trending
businesses
Load graph projections
from library
Write graphs to Neo4j
and run PageRank
Combine graphs in
Morpheus and select
trending businesses
https://git.io/fjZ2b
69. PageRank Algorithm
⢠Use when
⢠Anytime youâre looking for broad influence over a network
⢠Many domain specific variations for differing analysis, e.g. Personalized
PageRank for personalized recommendations
⢠Examples:
⢠Twitter Recommendations
⢠Fraud Detection
71. Demo Big Picture
Part 1
From JSON to Graph
Create persistent
Property Graph from
raw Yelp dataset
Read Yelp Data from
JSON into DataFrames
Create Property Graph
from DataFrames
Store Property Graph
using Parquet
Part 2
A library of Graphs
Create a library of
graph projections
Read Property Graph
from Parquet
Create subgraph for a
specifc city
Project and persist city
subgraph
Part 3
Federated queries
Integrate reviews with
social network data
DeďŹne Graph Type and
Mapping with Graph
DDL
Load data from Hive
and H2
Run analytical query on
the integrated graph
Part 5
Neo4j Integration II
Recommend
businesses to users
Load graph projections
from library
Write graphs to Neo4j,
run Louvain + Jaccard
Run analytical query in
Morpheus to ďŹnd
recommendations
Part 4
Neo4j Integration I
Find trending
businesses
Load graph projections
from library
Write graphs to Neo4j
and run PageRank
Combine graphs in
Morpheus and select
trending businesses
https://git.io/fjZ2b
72. Louvain Modularity
⢠Use when
⢠Community Detection in large networks
⢠Uncover hierarchical structures in data
⢠Examples
⢠Money Laundering
⢠Protein-Protein-Interactions
73. Jaccard Similarity
⢠Use when
⢠Computing pair-wise similarities
⢠Accommodates vectors of different lengths
⢠Examples
⢠Recommendations
⢠Disambiguation
74. Part 5: Community-centric Recommendation
call algo.louvain
(:User)-[:REVIEWS]->(:Business)
(:User)-[:CO_REVIEWS]->(:User)
call algo.jaccard
Recommend
businesses similar
users have
reviewed
2017
Compute similarity
based on overlapping
reviewed businesses
Compute
communities based
on co-reviews
for each
community
:IS_SIMILAR
https://git.io/fjZaU
77. Spark Project Improvement Proposal
⢠SPARK-25994 Spark Graph for Apache Spark 3.0
⢠Property Graphs, Cypher Queries, and Algorithms
⢠Defines a Cypher-compatible Property Graph type based on
DataFrames
⢠Replaces GraphFrames querying with Cypher
⢠Reimplements GraphFrames/GraphX algos on the Property Graph
type
78. SPIP: What are we trying to do?
⢠âSpark Cypherâ
⢠Run a Cypher 9 query on a Property Graph returning a tabular result
⢠Migrate GraphFrames to Spark Graph
⢠Implementation is based on Spark SQL
⢠Property Graphs are composed of one or more DFs
⢠Provide Scala, Python and Java APIs
79. SPIP: What are we not solving?
⢠Addresses the Cypher Property Graph Model
⢠Does not deal with variants of that model (e.g. RDF)
⢠No Cypher 10 multiple graph features
⢠API is flexible to support this in future iterations
⢠No Property Graph Catalog
⢠Also no Property Graph Data Sources
80. Try it out and get involved
[SPARK-27299][GRAPH][WIP] Spark Graph API design proposal
(GraphExamplesSuite.scala)
test("create PropertyGraph from Node- and RelationshipFrames") {
val nodeData: DataFrame = spark.createDataFrame(Seq(0 -> "Alice", 1 -> "Bob")).toDF("id", "name")
val relationshipData: DataFrame = spark.createDataFrame(Seq((0, 0, 1))).toDF("id", "source", "target")
val nodeFrame: NodeFrame = NodeFrame(nodeData, "id", Set("Person"))
val relationshipFrame: RelationshipFrame = RelationshipFrame(relationshipData, "id", "source", "target", "KNOWS")
val graph: PropertyGraph = cypherSession.createGraph(Seq(nodeFrame), Seq(relationshipFrame))
val result: CypherResult = graph.cypher(
"""
|MATCH (a:Person)-[r:KNOWS]->(:Person)
|RETURN a, r""".stripMargin)
result.df.show()
}
https://git.io/fjqp6
81. Morpheus + Cypher in Spark 3.0
Morpheus will be plug-compatible with Cypher in Spark 3.0
82. Morpheus and Spark Graph: API compatibility
spark-graph-api
spark-cypher
spark-sql
okapi morpheus
spark-sql
openCypherSPIP
Cypher to relational
operators compiler
openCypher