Beruflich Dokumente
Kultur Dokumente
1 Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3 Graph Workspaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.1 Create and Drop Graph Workspaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
3.2 Export and Import Graph Workspaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
6 Graph Algorithms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.1 Neighborhood Search (Breadth-First Search). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.2 Shortest Path. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.3 Strongly Connected Components. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
6.4 Graph Algorithm Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .37
6.5 Pattern Matching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Graphical Pattern Editor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
Cypher Query Language. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
7 Appendix. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
7.1 Appendix A – SAP HANA Graph Viewer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47
Install SAP HANA Graph Viewer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
7.2 Appendix B – Greek Mythology Graph Example. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
7.3 Appendix C – Notation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51
SAP HANA Graph is an integral part of SAP HANA core functionality. It expands the SAP HANA platform with
native support for graph processing and allows you to execute typical graph operations on the data stored in
an SAP HANA system.
Caution
The usage of cross-database access in multiple-container scenarios in combination with SAP HANA Graph
is not allowed.
Graphs are a powerful abstraction that can be used to model different kinds of networks and linked data
coming from many industries, such as logistics and transportation, utility networks, knowledge
representation, text processing, and so on.
In SAP HANA, a graph is a set of vertices and a set of edges. Each edge connects two vertices; one vertex is
denoted as the source and the other as the target. Edges are always directed and there can be two or more
edges connecting the same two vertices. Vertices and edges can have an arbitrary number of attributes. A
vertex attribute consists of a name that is associated with a data type and a value. Edge attributes consist of
the same information.
The following image provides an example of a graph in which vertices represent Greek mythology members
and edges represent the relationships among them. All vertices have attributes “NAME” (shown in the image)
and “TYPE” (shown in the image). "TYPE" takes one of the following values: ‘primordial deity’, ‘god’, ‘titan’.
Some vertices have an attribute “RESIDENCE” (not shown in the image). All edges have attributes “KEY” (not
shown in the image) and “TYPE”, which takes one of the following values: ‘marriedTo’, ‘hasSon’, and
‘hasDaugther’.
The following tables show the tabular storage of the Greek mythology graph.
Table 1: "GREEK_MYTHOLOGY"."MEMBERS"
(Unique Key)
Table 2: "GREEK_MYTHOLOGY"."RELATIONSHIPS"
(Unique Key)
Relational storage allows all the functions of SAP HANA to be applied to the graph data: access control,
backup and recovery, etc. It also allows all SAP HANA Graph functions to be applied to the graph data stored in
relational format coming from business applications. SAP HANA Graph provides a dedicated catalog object,
which is referred to as a graph workspace, for defining a graph in terms of the existing SAP HANA tables.
Related Information
A graph workspace is a catalog object that defines a graph in terms of tables and columns:
● vertex table
● edge table
● key column in the vertex table
● key column in the edge table
● source vertex column in the edge table
● target vertex column in the edge table
Both vertex key and edge key columns need to be flagged as unique and NOT NULL. A graph workspace can
be uniquely identified by the database schema it resides in and the workspace name. An SAP HANA instance
can contain multiple graph workspaces in the same schema (with different workspace names) or different
database schemas.
SAP HANA Graph provides SQL extensions for creating and dropping graph workspaces.
Before creating a graph workspace, check that the underlying tables, views or synonyms for vertices and
edges exist. The following SQL commands create a vertex table “MEMBERS” and an edge table
“RELATIONSHIPS” in a schema “GREEK_MYTHOLOGY”.
Having created all necessary tables we can now create a graph workspace “GRAPH” in the schema
“GREEK_MYTHOLOGY” with the following CREATE GRAPH WORKSPACE statement.
The vertex table, the edge table, and the graph workspace can reside in different schemas. If any of the
schemas is omitted, the default schema is assumed.
The columns of the edge table and the vertex table are interpreted correspondingly as edge and vertex
attributes. In the example in SAP HANA Graph Data Model, the vertices in the table
"GREEK_MYTHOLOGY"."MEMBERS" have the attributes “TYPE” and “RESIDENCE”, which may be set or not
set. A row in the vertex table or the edge table is interpreted correspondingly as a vertex or an edge.
The vertex and edge key columns can be of one of the following SQL types: TINY INT, SMALL INT, INTEGER,
BIG INT, VARCHAR, and NVARCHAR. The INTEGER types are recommended.
During the creation of a new graph workspace, SAP HANA Graph assures that all specified tables and columns
exist, and have supported data types. A newly created graph workspace is valid as long as the specified
columns and tables exist and fulfill the validity requirements:
A valid graph workspace is consistent if both source and target columns contain existing values from the
vertex key column. In the CREATE GRAPH WORKSPACE statements listed above, the referential constraints
(“REFERENCES”) are used to guarantee the consistency of the workspace.
An existing workspace “GRAPH” in schema “GREEK_MYTHOLOGY” can be deleted with the following
statement.
Creating or dropping graph workspaces does not modify the content of the underlying vertex and edge tables.
To create a graph workspace in a given schema, a user needs the CREATE ANY privilege in the given schema
and the SELECT privilege for both vertex and edge tables. To drop a graph workspace in a given schema, a
user must be the creator of the graph workspace or must have the DROP privilege for the given schema.
Related Information
Graph workspace objects can be exported from or imported into an SAP HANA system using the existing
export and import SQL commands.
Refer to the SAP HANA SQL and System Views Reference for the corresponding syntax and explanations. The
vertex and edge tables are by default exported together with a graph workspace unless the NO
DEPENDENCIES parameter is used.
Assuming the database instance is installed under /usr/sap/HDB/HDB00, the following statement exports
the graph workspace “GREEK_MYTHOLOGY”.”GRAPH” together with the vertex table
“GREEK_MYTHOLOGY”.”MEMBERS” and the edge table “GREEK_MYTHOLOGY”.”RELATIONSHIP”
to /usr/sap/HDB/HDB00/work
The following statement imports the graph workspace “GREEK_MYTHOLOGY”.”GRAPH” together with the
vertex table “GREEK_MYTHOLOGY”.”MEMBERS” and the edge table
“GREEK_MYTHOLOGY”.”RELATIONSHIP” from /usr/sap/HDB/HDB00/work
Exporting or importing a schema automatically exports or imports all graph workspaces contained in that
schema. For the full set of options for IMPORT and EXPORT commands, please refer to the SAP HANA SQL
and System Views Reference.
Related Information
Any change to the edge table or the vertex table will affect the edges or the vertices of the graph.
The following SQL statements create two new vertices with vertex keys ‘Chaos’ and ‘Gaia’ and an edge in the
workspace “GREEK_MYTHOLOGY”.”GRAPH”. For the complete list of statements for creating the example
graph in SAP HANA Graph Data Model, see Appendix B – Greek Mythology Graph Example.
Vertices can be modified and deleted done using SQL’s update and delete statements. The following
statement modifies the “RESIDENCE” attribute of the vertex ‘Cronus’.
The following statement deletes the vertex ‘Oceanus’ from the graph workspace
“GREEK_MYTHOLOGY”.”GRAPH”.
Edges can be inserted, updated, and deleted in the same way as vertices.
If the consistency of a graph workspace is not guaranteed by referential constraints (see Creating and
Dropping), modifications of the referenced graph tables can lead to an inconsistent graph workspace. In this
case, SAP HANA Graph functions will return an error.
Related Information
GraphScript is specifically designed to ease the development and integration of complex graph algorithms into
the existing data management workflow. At the same time, GraphScript provides competitive execution
performance for manually written and tuned graph algorithm implementations in a low-level programming
language.
This section describes the data types that are available in GraphScript.
The following table summarizes the supported data types in GraphScript and classifies them by their
characteristics as follows:
Table 3:
Numeric Types
Each numeric type has a maximum value and a minimum value. A numeric overflow exception will be thrown if
a given value is smaller than the minimum allowed value or greater than the maximum allowed value.
● INTEGER
The INTEGER data type stores a 32-bit signed integer. The minimum value is -2,147,483,648. The
maximum value is 2,147,483,647. All numerical literals that are not suffixed with 'L' are treated as integer
32-bit literals. A variable of type INTEGER will be default-initialized with value 0.
● BIGINT
The BIGINT data type stores a 64-bit signed integer. The minimum value is -9,223,372,036,854,775,808.
The maximum value is 9,223,372,036,854,775,807. Literal values of type BIGINT have to be suffixed with
'L'. A variable of type BIGINT will be default-initialized with value 0L.
Boolean Type
The BOOLEAN data type stores boolean values, which are TRUE and FALSE.
The character string data types are used to store values that contain character strings. VARCHAR data types
contain ASCII character strings and NVARCHAR are used for storing Unicode character strings.
● VARCHAR
The VARCHAR(n) data type specifies a variable-length character string, where n indicates the maximum
length in bytes and is an integer between 1 and 5000. SAP recommends using VARCHAR with ASCII
characters based strings only.
GraphScript supports three graph-specific data types, namely Vertex, Edge, and Graph.
● VERTEX
Represents a node (a vertex) in the graph. An existing vertex object can be retrieved from a graph
workspace using its unique identifier. Supported identifier types are INTEGER, BIGINT, and VARCHAR(n).
A vertex can only be retrieved from the underlying graph workspace; the creation of new vertices is not
supported. A variable of type VERTEX must be initialized at the time of declaration. There is no default
initialization for variables of type VERTEX.
● EDGE
Represents a relationship (an edge) in the graph. An existing edge object can be retrieved from a graph
workspace using its unique identifier. Supported identifier types are INTEGER, BIGINT, and VARCHAR(n).
An edge can only be retrieved from the underlying graph workspace; the creation of new edges is not
supported. A variable of type EDGE must be initialized at the time of declaration. There is no default
initialization for variables of type EDGE.
● GRAPH
A graph object represents a given data graph from the underlying graph workspace. A graph can be
retrieved using the optional schema name of the graph workspace and the workspace name. A graph can
only be retrieved from the underlying graph workspace; the creation of new graphs is not supported. A
variable of type GRAPH must be initialized at the time of declaration. There is no default initialization for
variables of type GRAPH.
A collection is a composite value comprising zero or more elements, whereby each element is a value of data
type DT. If the elements of collection C are values of DT, then C is said to be a collection of DT. The number of
elements in C is the cardinality of C.
● MULTISET
A multiset is an unordered collection. Since a multiset is unordered, there is no ordinal position to
reference individual elements of a multiset. The elements in a MULTISET can be of data type VERTEX or
EDGE.
GraphScript does not support implicit or explicit conversions between objects of different data types.
Typed Constants
'Brian'
'23'
● Numeric constants
A numeric constant is represented by a sequence of numbers that are not enclosed in quotation marks.
Numbers may contain a decimal point.
Examples
123
123L
123.4
● Boolean constants
A Boolean constant can be either true or false. Both constants are keywords in GraphScript and therefore
case-insensitive.
Note
NULL value handling is currently not supported.
5.4 Types
The type of an object is used in a definition statement to introduce new objects with the given type. Once an
object has been declared, the type of the object is immutable.
5.5 Comments
GraphScript supports single-line comments as well as multi-line comments. A single-line comment starts with
"--"; all characters that follow in the line will be treated as a comment. A multi-line comment is enclosed in "/*"
and "*/".
-- single-line comment
Int v = 23; -- this is a comment
-- multi-line comment
/*FOREACH e IN Edges(:g) {
Int i = :e.attr;
}*/
An expression is a language construct, which returns a value of a given type. GraphScript supports the
following expressions:
Literal Expressions
Examples
23
23L
23.5
'Brian'
The following list summarizes special characters/symbols that are used in GraphScript.
<comma> ::= ,
<single_quote> ::= '
<double_quote> ::= "
Identifiers
GraphScript uses identifiers to reference schema names, graph workspace names, and attribute names.
Semantically, GraphScript identifiers are equivalent to SQL identifiers.
GraphScript supports local variables to split large and complex statements into smaller ones, in order to
improve the overall readability. After the initial assignment/declaration (see Assignment Statements in
Statements), the type of a variable cannot be modified anymore. A local variable expression can be used at any
place that allows an expression---as long as the corresponding expression types match. Variable names are
case-insensitive.
Examples
aVariable
An attribute access expression allows you to retrieve the corresponding attribute value for a given local
variable name and a given attribute or temporary attribute name. The attribute name is an identifier, which
may be quoted. The return type of the expression is derived from the underlying specified attribute type.
Examples
:i.weight
:i."weight"
:i."weight int"
Relational Expressions
Relational expressions are binary expressions that compare the values produced by two expressions against
each other and return a Boolean value. Both expressions have to be of the same type. For types Vertex, Edge,
and Boolean, only equality and inequality comparisons are allowed.
Examples
2 > 3
3 == 4
:a.weight > 3
Arithmetic Expressions
Arithmetic expressions are binary expressions that take two expressions and an arithmetic operator and
produce a result. Both expressions have to be of the same type.
Logical expressions are binary expressions that take two expressions and a logical operator and produce a
Boolean result value. Both expressions have to be of the same type.
Examples
(3 == 4) AND (4 == 3)
TRUE OR (:a.weight > 3)
NOT (3 == 2)
A collection initializer expression can be used to initialize a multiset with a set of objects.
Examples
Graph g = Graph("MYWORKSPACE");
{ Vertex(:g,1), Vertex(:g,2), Vertex(:g,1) }
Function Expressions
A function expression takes a list of parameters and produces a result of the specified type. A function can be
overloaded on the parameters; in other words, there can be multiple function definitions with the same
function name and different parameters. Overloading based solely on the function return type is not
supported. For a complete list of supported built-in functions, see Built-in Functions.
5.7 Statements
A temporary attribute can be used to store vertex-centric or edge-centric state information at script runtime.
Read access to temporary attributes is the same as for persistent attributes; write access is only allowed on
temporary attributes.
Definition Statements
A definition statement declares and defines a local variable of a specific type. Objects of primitive types are
default-initialized to zero, for numeric values, and to an empty string, for character-based objects. Vertices,
edges, and graphs have to be initialized in the declaration. A variable is visible and accessible in the current
scope and all inner scopes, such as in loops and conditional statements. Variables defined inside of loops and
conditional statements are not accessible outside of the statements. GraphScript does not support variable
shadowing; in other words, a variable defined in an outer scope cannot be redefined in an inner scope.
Examples
Graph g1 = Graph("MYSCHEMA","MYWORKSPACE");
Graph g2 = Graph("MYWORKSPACE");
Graph g3 = Graph(MYWORKSPACE);
Vertex v = Vertex(:g1,1);
Edge e = Edge(:g1,'3');
Int i;
Double d = 23.5;
Varchar(10) s = 'Dave';
Assignment Statements
An assignment statement binds the result of an expression to a local variable. Alternatively, if the left-hand
side of the assignment statement is an attribute access expression, the value of the right-hand side expression
is assigned to the corresponding attribute.
Examples
Graph g = Graph("MYWORKSPACE");
Int i;
i = 23;
Vertex v = Vertex(:g,1);
v.attr = 23;
Conditional Statements
A conditional statement consists of an IF body and an optional ELSE body. Each body might contain a list of
statements (which may be empty) and the list of statements is enclosed in curly brackets. If the expression
<expr> in the IF branch evaluates to TRUE, the corresponding statements in the IF body are executed,
otherwise the statements in the ELSE branch are executed.
Examples
IF (2 < 3) {
IF (TRUE) {
Int i;
} ELSE {
Int i;
}
}
A foreach loop iterates over a multiset of vertices or edges. The iteration order is not specified and should not
be assumed to be the same for two different script executions. In the loop body, a list of statement can be
specified, which can reference the defined variable in the loop header. The variable scope of the variable is
defined as the inner body of the loop statement; in other words, the variable cannot be referenced anymore
after the loop statement.
Examples
Graph g = Graph("MYWORKSPACE");
FOREACH v IN { Vertex(:g,1), Vertex(:g,2) } {
Int a = :v.attr;
The following table providess a summary of the built-in functions available in GraphScript.
Table 4:
Reserved words are words, which have a special meaning to the GraphScript parser in the SAP HANA
database and cannot be used as variable names and identifiers.
Reserved words should not be used in GraphScript statements for schema and graph workspace object
names. If necessary, you can work around this limitation by delimiting a schema name, a column name, or a
graph workspace name in double quotation marks.
The following table lists all the current reserved words for the GraphScript:
Table 5:
DYNAMIC_FUNC
TION_CODE
FOUND
GOTO GRANTED
JOIN
MUMPS
ST_MULTIPOLYGON SWITCH
VIEW VOID
WRITE
YEAR
ZONE
The table below shows the maximum allowable limit for each entry.
Table 6:
Description Limit
The following example depicts a more complex example of a GraphScript procedure. It uses the Greek
mythology data set and computes the number of goddesses, who live in the underworld.
SAP HANA Graph provides a new graph calculation node that can be used in calculation scenarios.
This node allows you to execute one of the available actions on the given graph workspace and provide results
as table output.
Calculation scenarios can be created with plain SQL as shown in the following section or with tools such as the
SAP HANA Modeler (see SAP HANA Modeling Guide) or a native SAP HANA Graph Viewer (see Appendix A:
SAP HANA Graph Viewer).
Table 7:
Parameter Value
● GET_NEIGHBORHOOD
● GET_SHORTEST_PATHS_ONE_TO_ALL
● GET_STRONGLY_CONNECTED_COMPONENTS
● MATCH_SUBGRAPHS
In order to use the graph node, a user needs SELECT privileges on the given graph workspace.
Each action has a set of additional parameters. The remainder of this section describes the available actions
and their additional parameters.
The GET_NEIGBORHOOD graph action retrieves the neighboring vertices within the given radius (depth) from
the given start vertices.
This action allows you to specify multiple start vertices, choose traversal direction, setting filters on vertices
and edges, and setting minimum and maximum depth (radius) of the neighborhood.
Table 8:
Parameter Value
Table 9:
Parameter Value
vertex table Contains the set of explored vertices with vertex key and the
depth level of the neighborhood.
The SQL statement used in the following code sample creates a calculation scenario with a single graph node
with the GET_NEIGHBORHOOD action on the graph workspace “GREEK_MYTHOLOGY”.”GRAPH”. This scenario
traverses the underlying graph using all outgoing edges starting from vertex ‘Chaos’ and returns vertices
with minimum depth 0 and maximum depth 2 from the start vertex.
The following SQL statement executes the calculation scenario and orders the resulting vertices by depth in
reverse order.
Table 10:
NAME DEPTH
Chaos 0
Gaia 1
Uranus 2
Cronus 2
Rhea 2
The same result can be obtained through the SAP HANA Graph Viewer web tool (see Appendix A – SAP HANA
Graph Viewer).
The following SQL statement deletes the calculation scenario and its corresponding view:
Note
The SAP HANA Graph Viewer can be used to create the calculation scenario, execute the neighborhood
search on the selected graph workspace with specific parameters and to visualize the result. Afterwards the
generated calculation scenario can be reused in all kinds of SQL queries.
This action provides the information for the shortest path from the starting vertex to all reachable vertices.
The action GET_SHORTEST_PATHS_ONE_TO_ALL returns the shortest paths from the provided start vertex to
all reachable vertices in the graph - also known as single-source shortest path (SSSP). The resulting shortest
paths form a tree structure with the start vertex at the root. All other vertices carry the shortest distance
(smallest weight) information. The non-negative edge weights are read from the column provided in the edge
table.
Table 11:
Parameter Value
Table 12:
Parameter Value
The SQL statement used in the following code sample creates a calculation scenario with a single graph node
with the action GET_SHORTEST_PATHS_ONE_TO_ALL on the workspace “GREEK_MYTHOLOGY”.”GRAPH”.
This scenario calculates shortest paths from the vertex ‘Chaos’ to all other vertices. Since input weight column
parameter is not specified, the weight of each edge is considered as 1.
The result of this operation is the vertex table with an additional column for shortest distance:
Table 13:
NAME DISTANCE
Chaos 0
Gaia 1
Uranus 2
Cronus 2
Rhea 2
Zeus 3
Poseidon 3
Hades 3
Aphrodite 3
Demeter 3
Hera 3
Ares 4
Athena 4
Hephaestus 4
Persephone 4
Note
The same results can also be obtained by executing GET_NEIGHBORHOOD action with startVertices equal
to [‘Chaos’], direction equal to ‘outgoing’, minDepth equal to ‘0’, maxDepth equal to ‘*’, and depthColumn
equal to ‘DISTANCE’.
The following SQL statement drops the calculation scenario and all its views.
The result of this operation is the edge table containing edge keys, source vertex keys and target vertex keys:
Table 14:
1 Chaos Gaia
2 Gaia Uranus
3 Gaia Cronus
5 Gaia Rhea
7 Cronus Zeus
9 Cronus Hera
11 Cronus Demeter
13 Cronus Poseidon
15 Cronus Hades
17 Zeus Athena
18 Zeus Ares
20 Uranus Aphrodite
21 Zeus Hephaestus
23 Zeus Persephone
The following SQL statement drops the calculation scenario and all its views.
Note
The SAP HANA Graph Viewer can be used to create the calculation scenario, execute the shortest path
algorithm on the selected graph workspace with specific parameters and to visualize the result. Afterwards
the generated calculation scenario can be reused in all kinds of SQL queries.
A directed graph is said to be strongly connected if every vertex is reachable from every other vertex. The
strongly connected components of an arbitrary directed graph form a partition into subgraphs that are
themselves strongly connected.
The only output of this action is a table containing the vertex key column and a “COMPONENT” column
containing strongly connected component indices. All vertices with the same component index belong to the
same strongly connected component.
Table 15:
Parameter Value
Table 16:
Parameter Value
vertex table Contains vertex key column and component index column
The SQL statement used in the following code sample creates a calculation scenario with a single graph node
with the GET_STRONGLY_CONNECTED_COMPONENTS action on the graph workspace
“GREEK_MYTHOLOGY”.”GRAPH”.
The following SQL statement executes the calculation scenario and sorts the result by the component index.
NAME COMPONENT
Athena 1
Ares 2
Aphrodite 3
Hephaestus 3
Hades 4
Persephone 4
Zeus 5
Hera 5
Demeter 6
Poseidon 7
Rhea 8
Cronus 8
Gaia 9
Uranus 9
Chaos 10
The same result can be obtained through the SAP HANA Graph Viewer web tool (see Appendix A – Graph
Viewer).
In our example, the fifteen vertices are partitioned into ten strongly connected components, because there are
five couples and the ‘marriedTo’ relationship goes in both directions, forming a cycle of two vertices. The
following SQL statement deletes the calculation scenario and its corresponding view.
Graph variables allow to parameterize calculation scenarios, so that the same graph action can be called with
different parameters.
Using the graph variables, a user needs to create only one calculation scenario for a combination of the graph
workspace and the graph action.
Note
The SAP HANA Graph Viewer can be used to create the calculation scenario, execute the strongly
connected component algorithm on the selected graph workspace with specific parameters, and visualize
the result. Afterwards the generated calculation scenario can be reused in all kinds of SQL queries.
Pattern matching is a kind of graph query, which involves finding all the subgraphs (within a graph) that match
the given pattern.
SAP HANA Graph provides two options for executing graph pattern queries. The first option is to use the
graphical pattern editor of the Graph Viewer tool. The second option is to describe the pattern in Cypher query
language (Cypher is a registered trademark of Neo Technology, Inc.).
The SAP HANA Graph Viewer (see Appendix A: SAP HANA Graph Viewer) allows you to visually compose
pattern matching queries, execute them, and visualize the results.
The graphical pattern contains a set of vertex variables, a set of edge variables, a set of filter conditions, a
projection list, an order-by list, a limit and an offset.
The result of the graphical pattern matching query is a projection of subgraphs within a given graph workspace
that are isomorphic to the given pattern. The columns of the result table correspond to the projection list of
the given pattern. Every row in the result table corresponds to a matching isomorphic subgraph.
The following example represents a subgraph pattern that contains three vertices and three edges. The first
two vertices A and B are connected with an edge filtered by attribute TYPE of value marriedTo. The third vertex
C is connected to the first two vertices through incoming edges and vertex C is filtered by attribute NAME on
value Ares. The pattern searches for parents of god Ares.
Table 18:
Note
We get the same matching subgraph two times because our pattern has a symmetry (or two
automorphisms, to be precise). In other words, we do not specify which of the two is the father and which is
the mother in our data, and therefore both options are valid answers (see Appendix B: Greek Mythology
Graph Example). The symmetry in this particular query can be avoided by adding an extra condition on A
and B vertices: A.NAME < B.NAME.
Action MATCH_SUBGRAPHS allows you to execute pattern matching queries written in the supported subset
of the Cypher query language on the given graph workspace.
Table 19:
Table 20:
The SQL statement used in the following code sample creates a calculation scenario with a single graph node
with the MATCH_SUBGRAPHS action on the graph workspace "GREEK_MYTHOLOGY"."GRAPH". The Cypher
query searches for the married parents of the Greek god Ares. Note, that single quotes inside the query need
to be properly escaped when creating a calculation scenario.
The following SQL statement executes the calculation scenario and orders the result by the first parent's name
and then by the second parent's name.
Table 21:
PARENT1_NAME PARENT2_NAME
Hera Zeus
Zeus Hera
The following grammar describes the currently supported subset of the Cypher query language.
All keywords (MATCH, WHERE, OR, AND, NOT, RETURN, AS, ORDER, BY, ASC, DESC, LIMIT, SKIP) are case-
insensitive. Attribute names, variable names, and aliases are case-sensitive.
The MATCH clause defines the topology of subgraphs to be matched within the graph workspace using a
comma-separated list of vertex and edge patterns (variables). The optional WHERE clause of the MATCH
clause allows you to add additional (non-topological) constraints as Boolean expressions involving vertex and
edge attributes, constants, comparison predicates =, <>, >, <, >=. <=, and logical connectives AND, OR, and
NOT.
The RETURN clause lists the attributes of vertices and edges of the matched subgraphs that need to be
projected into the resulting table. The optional ORDER-BY clause allows you to sort the resulting rows in
ascending or descending order. The optional LIMIT clause of the RETURN clause truncates the resulting table
to the given number of rows (from the top) if the result has more rows than the given number. Otherwise all
the rows are displayed. The optional SKIP clause excludes the given number of rows from the top of the result.
When all three optional clauses are present, the ORDER-BY clause is applied first, then the SKIP clause, and
finally the LIMIT clause.
The following Cypher query returns the values of "NAME" attribute of all vertices in the given graph.
MATCH (a)
RETURN a.NAME AS name
ORDER BY a.NAME ASC
Table 22:
name
Aphrodite
Ares
Athena
Chaos
Cronus
Demeter
Gaia
Hades
Hephaestus
Hera
Hephaestus
Hera
Persephone
Poseidon
Rhea
Uranus
Zeus
The following query illustrates the use of LIMIT clause applied to the result
from the previousMATCH (a)
RETURN a.NAME AS name
ORDER BY a.NAME ASC
LIMIT 5The following query illustrates the use of LIMIT clause applied to the
result from the previous
example:
Table 23:
name
Aphrodite
Ares
Athena
Chaos
Cronus
MATCH (a)
RETURN a.NAME AS name
ORDER BY a.NAME ASC
LIMIT 5
SKIP 1
Table 24:
name
Ares
Athena
Chaos
Cronus
Demeter
The following query illustrates the case sensitivity of variable names ("a" and "A" are not the same).
This query also illustrates a disconnected graph pattern, since vertices "a" and "A" are not connected by any
edge. In other words, there are two connected components, each of them containing one vertex. From a
performance perspective, we recommend that you avoid matching disconnected subgraphs wherever
possible, because the result is the Cartesian product of matches of all connected components (225 rows), and
it can easily get very large and take a lot of system resources.
The following query returns the values of "TYPE" attribute of all edges in the given graph.
MATCH (a)-[e]->(b)
RETURN e.TYPE AS type
ORDER BY e.TYPE ASC
The following query matches a directed path of two distinct edges (possibly a cycle) starting from a vertex with
NAME = 'Zeus' (attribute "NAME" is vertex key in the graph workspace "GREEK_MYTHOLOGY"."GRAPH").
Table 25:
The following query matches a directed path of two distinct edges that do not form any kind of cycle (also not
a "self-loop" where the source and the target of an edge is the same vertex).
Table 26:
The following query illustrates the case sensitivity of aliases and returns the values of "NAME" attribute of all
pairs of vertices in the given graph connected by an edge.
MATCH (A)-[e]->(a)
RETURN a.NAME AS name, A.NAME as NAME
ORDER BY a.NAME ASC, A.NAME DESC
The following query illustrates the use of logical connective OR. Note, that OR has lower precedence than AND.
MATCH (a)-[e]->(b)
WHERE a.NAME = 'Cronus' AND e.KEY < 10 OR b.NAME <> 'Poseidon'
RETURN b.NAME AS Name
ORDER BY b.NAME
This query returns the targets of all edges, except for two edges that are pointing at Poseidon (32 of 34
edges).
The following query illustrates the use of parentheses to evaluate the OR connective before the AND
connective.
MATCH (a)-[e]->(b)
WHERE a.NAME = 'Cronus' AND (e.KEY < 10 OR b.NAME <> 'Poseidon')
RETURN b.NAME AS Name
ORDER BY b.NAME
Table 27:
Name
Demeter
Hades
Hera
Rhea
Zeus
The following query illustrates the use of logical connective NOT. Note, that NOT has a higher precedence than
AND and OR and therefore it is evaluated at first.
MATCH (a)-[e]->(b)
WHERE a.NAME = 'Cronus' AND (e.KEY < 10 OR NOT b.NAME = 'Poseidon')
RETURN b.NAME AS Name
ORDER BY b.NAME
For more information see, see SAP Note 2306732 - SAP HANA Graph Viewer and Deploy a Delivery Unit Archive
(*.tgz) in the SAP HANA Master Guide.
Note
After the installation, the SAP HANA Graph Viewer can be accessed via the following URL: http://
<WebServerHost>:80<SAPHANAinstance>/sap/hana/graph/viewer/
The SAP HANA Graph Viewer supports the following Web browsers: Chrome and Mozilla Firefox.
Related Information
You can use the following SQL statements to create the Greek mythology graph example.
The syntactic notation used in this guide is an extended version of BNF ("Backus Naur Form").
In a BNF language definition, each syntactic element of the language (known as a BNF nonterminal symbol) is
defined by means of a production rule. This defines the element in terms of a formula consisting of the
characters, character strings, and syntactic elements that can be used to form an instance of the formula.
The following table explains the symbols used and their meanings:
Table 28:
Symbol Meaning
<> A character string enclosed in angle brackets is the name of a syntactic element (BNF nontermi
nal) of the GraphScript language.
::= The definition operator is used in a production rule to separate the element defined by the rule
from its definition. The element being defined appears to the left of the operator and the formula
that defines the element appears to the right.
[] Square brackets indicate optional elements in a formula. The portion of the formula within the
brackets may be explicitly specified or may be omitted.
{} Braces group elements in a formula. Curly braces indicate that the expression may be repeated
zero or more times.
| The alternative operator. The vertical bar indicates that the portion of the formula following the
bar is an alternative to the portion preceding the bar. If the vertical bar appears at a position
where it is not enclosed in braces or square brackets, it specifies a complete alternative for the
element defined by the production rule. If the vertical bar appears in a portion of a formula en
closed in braces or square brackets, it specifies alternatives for the contents of the innermost pair
of these braces or brackets.
!! Introduces normal English text. This is used when the definition of a syntactic element is not ex
pressed in BNF.
Spaces are used to separate syntactic elements. Multiple spaces and line breaks are treated as a single space.
Apart from those symbols with special functions (see above), other characters and character strings in a
formula stand for themselves. In addition, if the symbols to the right of the definition operator in a production
consist entirely of BNF symbols, then these symbols stand for themselves and do not take on their special
meaning.
Pairs of braces and square brackets may be nested to any depth, and the alternative operator may appear at
any depth within such a nest.
A character string, which forms an instance of any syntactic element, can be generated from the BNF
definition of that syntactic element by performing the following steps:
1. Select any one option from those defined in the right hand side of a production rule for the element and
replace the element with this option.
2. Replace each ellipsis, and the object it applies to, with one or more instances of that object.
The expansion or production is complete when no further non-terminal symbols remain in the character string.
The left normal form derivation of a character string CS in the source language character set from a BNF
nonterminal NT is obtained by applying step 1. through step 5. above to NT, always selecting in step 5. the
leftmost BNF nonterminal.
Coding Samples
Any software coding and/or code lines / strings ("Code") included in this documentation are only examples and are not intended to be used in a productive system
environment. The Code is only intended to better explain and visualize the syntax and phrasing rules of certain coding. SAP does not warrant the correctness and
completeness of the Code given herein, and SAP shall not be liable for errors or damages caused by the usage of the Code, unless damages were caused by SAP
intentionally or by SAP's gross negligence.
Accessibility
The information contained in the SAP documentation represents SAP's current view of accessibility criteria as of the date of publication; it is in no way intended to be
a binding guideline on how to ensure accessibility of software products. SAP in particular disclaims any liability in relation to this document. This disclaimer, however,
does not apply in cases of willful misconduct or gross negligence of SAP. Furthermore, this document does not result in any direct or indirect contractual obligations
of SAP.
Gender-Neutral Language
As far as possible, SAP documentation is gender neutral. Depending on the context, the reader is addressed directly with "you", or a gender-neutral noun (such as
"sales person" or "working days") is used. If when referring to members of both sexes, however, the third-person singular cannot be avoided or a gender-neutral noun
does not exist, SAP reserves the right to use the masculine form of the noun and pronoun. This is to ensure that the documentation remains comprehensible.
Internet Hyperlinks
The SAP documentation may contain hyperlinks to the Internet. These hyperlinks are intended to serve as a hint about where to find related information. SAP does
not warrant the availability and correctness of this related information or the ability of this information to serve a particular purpose. SAP shall not be liable for any
damages caused by the use of related information unless damages have been caused by SAP's gross negligence or willful misconduct. All links are categorized for
transparency (see: http://help.sap.com/disclaimer).