This page documents the supported openCypher Syntax that BloodHound officially supports
This article describes how to use Cypher Search within BloodHound. Users of BloodHound should use it to extend the basic search functionality of BloodHound.
Below are the currently supported openCypher query components translated by CySQL.
The following operators are supported in authoring comparison expressions:
=
<>
<
>
<=
>=
When authoring comparison statements, users must be aware of the typing requirements of CySQL compared to Cypher as executed by Neo4j.
For more information see the Differences between Cypher and CySQL
subsection Stricter Typing Requirements
.
Negation in query filters is supported with the not
operator:
match (n:User) where not(n.eligible) return n
Conjunction and
and disjunction or
operators are both supported:
match (n:User) where n.eligible and n.enabled return n
match (n:User) where n.eligible or n.seen_as_active return n
Searching strings may be performed in a variety of ways. These matches are case-sensitive and do not support wildcard expansions.
A string property may be filtered by prefix matching:
match (n:User) where n.name starts with 'my prefix' return n
A string property may be filtered by contains matching:
match (n:User) where n.details contains 'something interesting' return n
A string property may be filtered by suffix matching:
match (n:User) where n.name ends with 'my suffix' return n
match (n:User) where n.name =~ 'userPrefix.*' return n
Query filters may also include pattern lookups. For example, searching for users with no active login sessions:
match (n:User) where not((n)<-[:HasSession]-(:Computer)) return n
collect
A collect subquery expression can be used to create a list with the rows returned by a given subquery.
count
Aggregates and counts the results of the given subquery as an integer.
duration
FunctionParses a valid duration string into a time duration that can be used in conjunction with other duration or date types.
id
FunctionReturns the entity identifier of the node or relationship.
localtime
Returns the local time without timezone information.
localdatetime
Returns the local datetime without timezone information.
date
Returns the current date with timezone information.
datetime
Returns the current datetime with timezone information.
type
Returns the type of the given relationship reference. This function returns the relationship’s type as a text value. Type checks utilizing this function will not be index accelerated and may exhibit poor performance.
split
Takes a given expression and text delimiter and returns a text array containing split components, if any. If the given expression does not evaluate to a text value this function will raise an error.
tolower
Returns the localized lower-case variant of a given expression. If the given expression does not evaluate to a text value this function will raise an error.
toupper
Returns the localized upper-case variant of a given expression. If the given expression does not evaluate to a text value this function will raise an error.
tostring
Returns the text value of a given expression. If the given expression represents a type that can not be converted to text this function will raise an error.
toint
Returns the integer value of a given expression. If the given expression represents a type that can not be converted or parsed to an integer this function will raise an error.
coalesce
Returns the first non-null value in a list of expressions. This is critically useful for navigating differences in
null
behavior between Cypher and CySQL.
size
Returns the number of items in an expression that evaluates to any array type.
The size
function is expected to behave differently if the given expression evaluates to a text value. In this case,
the function returns the number of Unicode characters present in the text value. This behavior is currently not
supported in CySQL translation.
The below issues are known defects. They are classified as defects of CySQL as the intent is to correctly support their use.
The create
reserved Cypher keyword is currently unsupported. Future support of it is planned.
labels
FunctionReturns the labels of the given node reference. This function returns the node’s labels as a text array value. Label checks utilizing this function will not be index accelerated and may exhibit poor performance.
While currently implemented this function returns the smallint array of labels associated with a node when referenced in CySQL. Future support to convert the smallint array of node labels into text values is planned.
The pattern lookup functions head
, tail
and last
are not currently supported These functions are typically used to
reference different parts of a matched pattern.
Support for them is planned for a future version of CySQL.
Arrays containing graph entities are not unpacked during comparisons:
Queries that contain similar constructs will result in the following translation error:
ERROR: column notation .id applied to type nodecomposite[], which is not a composite type (SQLSTATE 42809)
.
Patterns that utilize a bound reference in the right-hand node pattern will not correctly author the required SQL joins:
Queries that contain similar constructs will result in the following translation error:
ERROR: invalid reference to FROM-clause entry for table "s0" (SQLSTATE 42P01)
.
Untyped array references, including empty arrays, fail to pass type inference checks in CySQL. Support for additional type hinting and inference is required to better support these use-cases.
Queries that contain similar constructs will result in the following translation error:
Error: array literal has no available type hints
.
Quantifier Expressions are currently unsupported but planned.
Below are constructs of the Cypher language that did not make the 1.0 definition of the CySQL specification. Future efforts may be pursued to add support for these language features.
Translating Cypher to SQL via CySQL comes with a few semantic differences that users should be aware of.
SQL comparisons are stricter than comparisons executed in Neo4j. Some of these typing constraints are handled automatically by CySQL, however, some type mismatches do make it down to the underlying SQL database.
Given the Cypher query: match (n:User) where n.name = 123 return n limit 1;
The translated SQL, when executed, results in the following error:
Error: ERROR: invalid input syntax for type bigint: "MYUSER@DOMAIN.COM" (SQLSTATE 22P02)
This indicates that there is a node with a value for n.name
that is not parsable as an integer.
In the future, CySQL translation will cover most of the strict typing requirements automatically for users.
Indexing in CySQL does not require a label specifier to be utilized. If the node property name
is indexed in CySQL,
both:
and
will use the name
index regardless of node label.
Behavior around null
in SQL differs from how Neo4j executes Cypher. Certain expression operators in Neo4j’s
implementation of Cypher will treat null
differently than their SQL counterparts while some semantics are very
similar.
Ideally, entity properties should strive to remove null
as a conditional case as much as possible. In cases where this
is not possible, users are advised to exercise the coalesce(...)
function:
null
can taint result sets and also further complicate future comparisons in the query:
The reference n
is being projected by the multipart with
statement but this projection removes the resultset from
the original query, allowing for ambiguity to slip into future operations against n.name
where some values of
n.name
may be null
.
This page documents the supported openCypher Syntax that BloodHound officially supports
This article describes how to use Cypher Search within BloodHound. Users of BloodHound should use it to extend the basic search functionality of BloodHound.
Below are the currently supported openCypher query components translated by CySQL.
The following operators are supported in authoring comparison expressions:
=
<>
<
>
<=
>=
When authoring comparison statements, users must be aware of the typing requirements of CySQL compared to Cypher as executed by Neo4j.
For more information see the Differences between Cypher and CySQL
subsection Stricter Typing Requirements
.
Negation in query filters is supported with the not
operator:
match (n:User) where not(n.eligible) return n
Conjunction and
and disjunction or
operators are both supported:
match (n:User) where n.eligible and n.enabled return n
match (n:User) where n.eligible or n.seen_as_active return n
Searching strings may be performed in a variety of ways. These matches are case-sensitive and do not support wildcard expansions.
A string property may be filtered by prefix matching:
match (n:User) where n.name starts with 'my prefix' return n
A string property may be filtered by contains matching:
match (n:User) where n.details contains 'something interesting' return n
A string property may be filtered by suffix matching:
match (n:User) where n.name ends with 'my suffix' return n
match (n:User) where n.name =~ 'userPrefix.*' return n
Query filters may also include pattern lookups. For example, searching for users with no active login sessions:
match (n:User) where not((n)<-[:HasSession]-(:Computer)) return n
collect
A collect subquery expression can be used to create a list with the rows returned by a given subquery.
count
Aggregates and counts the results of the given subquery as an integer.
duration
FunctionParses a valid duration string into a time duration that can be used in conjunction with other duration or date types.
id
FunctionReturns the entity identifier of the node or relationship.
localtime
Returns the local time without timezone information.
localdatetime
Returns the local datetime without timezone information.
date
Returns the current date with timezone information.
datetime
Returns the current datetime with timezone information.
type
Returns the type of the given relationship reference. This function returns the relationship’s type as a text value. Type checks utilizing this function will not be index accelerated and may exhibit poor performance.
split
Takes a given expression and text delimiter and returns a text array containing split components, if any. If the given expression does not evaluate to a text value this function will raise an error.
tolower
Returns the localized lower-case variant of a given expression. If the given expression does not evaluate to a text value this function will raise an error.
toupper
Returns the localized upper-case variant of a given expression. If the given expression does not evaluate to a text value this function will raise an error.
tostring
Returns the text value of a given expression. If the given expression represents a type that can not be converted to text this function will raise an error.
toint
Returns the integer value of a given expression. If the given expression represents a type that can not be converted or parsed to an integer this function will raise an error.
coalesce
Returns the first non-null value in a list of expressions. This is critically useful for navigating differences in
null
behavior between Cypher and CySQL.
size
Returns the number of items in an expression that evaluates to any array type.
The size
function is expected to behave differently if the given expression evaluates to a text value. In this case,
the function returns the number of Unicode characters present in the text value. This behavior is currently not
supported in CySQL translation.
The below issues are known defects. They are classified as defects of CySQL as the intent is to correctly support their use.
The create
reserved Cypher keyword is currently unsupported. Future support of it is planned.
labels
FunctionReturns the labels of the given node reference. This function returns the node’s labels as a text array value. Label checks utilizing this function will not be index accelerated and may exhibit poor performance.
While currently implemented this function returns the smallint array of labels associated with a node when referenced in CySQL. Future support to convert the smallint array of node labels into text values is planned.
The pattern lookup functions head
, tail
and last
are not currently supported These functions are typically used to
reference different parts of a matched pattern.
Support for them is planned for a future version of CySQL.
Arrays containing graph entities are not unpacked during comparisons:
Queries that contain similar constructs will result in the following translation error:
ERROR: column notation .id applied to type nodecomposite[], which is not a composite type (SQLSTATE 42809)
.
Patterns that utilize a bound reference in the right-hand node pattern will not correctly author the required SQL joins:
Queries that contain similar constructs will result in the following translation error:
ERROR: invalid reference to FROM-clause entry for table "s0" (SQLSTATE 42P01)
.
Untyped array references, including empty arrays, fail to pass type inference checks in CySQL. Support for additional type hinting and inference is required to better support these use-cases.
Queries that contain similar constructs will result in the following translation error:
Error: array literal has no available type hints
.
Quantifier Expressions are currently unsupported but planned.
Below are constructs of the Cypher language that did not make the 1.0 definition of the CySQL specification. Future efforts may be pursued to add support for these language features.
Translating Cypher to SQL via CySQL comes with a few semantic differences that users should be aware of.
SQL comparisons are stricter than comparisons executed in Neo4j. Some of these typing constraints are handled automatically by CySQL, however, some type mismatches do make it down to the underlying SQL database.
Given the Cypher query: match (n:User) where n.name = 123 return n limit 1;
The translated SQL, when executed, results in the following error:
Error: ERROR: invalid input syntax for type bigint: "MYUSER@DOMAIN.COM" (SQLSTATE 22P02)
This indicates that there is a node with a value for n.name
that is not parsable as an integer.
In the future, CySQL translation will cover most of the strict typing requirements automatically for users.
Indexing in CySQL does not require a label specifier to be utilized. If the node property name
is indexed in CySQL,
both:
and
will use the name
index regardless of node label.
Behavior around null
in SQL differs from how Neo4j executes Cypher. Certain expression operators in Neo4j’s
implementation of Cypher will treat null
differently than their SQL counterparts while some semantics are very
similar.
Ideally, entity properties should strive to remove null
as a conditional case as much as possible. In cases where this
is not possible, users are advised to exercise the coalesce(...)
function:
null
can taint result sets and also further complicate future comparisons in the query:
The reference n
is being projected by the multipart with
statement but this projection removes the resultset from
the original query, allowing for ambiguity to slip into future operations against n.name
where some values of
n.name
may be null
.