Purpose
This article describes how to use Cypher Search within BloodHound. Users of BloodHound should use it to extend the basic search functionality of BloodHound.Supported Query Components
Below are the currently supported openCypher query components translated by CySQL.Pattern Matching
Node Matching
Inline Node Label Matchers
Inline Node Pattern Property Matchers
Relationship Matching
Recursive Expansion
Ranges for Recursive Expansion
Pattern Projections
Multiple Reading Clauses
Shortest Paths
All Shortest Paths
Return Options
Order
Skip and Limit
Entity Updates
Setting Properties and Labels
Removing Properties and Labels
Entity Deletion
Supported Query Filters
Comparison Expressions
The following operators are supported in authoring comparison expressions:=
<>
<
>
<=
>=
Differences between Cypher and CySQL
subsection Stricter Typing Requirements
.
Negation
Negation in query filters is supported with thenot
operator:
Conjunction and Disjunction
Conjunctionand
and disjunction or
operators are both supported:
String Searching
Searching strings may be performed in a variety of ways. These matches are case-sensitive and do not support wildcard expansions.String Prefix Matching
A string property may be filtered by prefix matching:String Contains Matching
A string property may be filtered by contains matching:String Suffix Matching
A string property may be filtered by suffix matching:Regular Expressions
Pattern Predicates
Query filters may also include pattern lookups. For example, searching for users with no active login sessions:Quantifier Expressions
any
Returns true if at least one item in the list contains the specified value.
single
Indicates that exactly one item in the list contains the specified value.
none
Indicates that none of the objects in the list contain the specified value.
all
Indicates that all objects in the list contain the specified value.
Supported Subquery Expressions
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.
Supported Cypher Functions
duration
Function
Parses a valid duration string into a time duration that can be used in conjunction with other duration or date types.
id
Function
Returns 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.
Caveats
Thesize
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.
Known Defects in Supported Components
The below issues are known defects. They are classified as defects of CySQL as the intent is to correctly support their use.Entity Creation
Thecreate
reserved Cypher keyword is currently unsupported. Future support of it is planned.
labels
Function
Returns 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.
Caveats
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.Pattern Lookup Functions
The pattern lookup functionshead
, 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.
Unpacking Arrays of Entities for Comparison
Arrays containing graph entities are not unpacked during comparisons:ERROR: column notation .id applied to type nodecomposite[], which is not a composite type (SQLSTATE 42809)
.
Right-Hand Bound Node Lookups
Patterns that utilize a bound reference in the right-hand node pattern will not correctly author the required SQL joins:ERROR: invalid reference to FROM-clause entry for table "s0" (SQLSTATE 42P01)
.
Untyped Array References and Literals
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.Error: array literal has no available type hints
.
Unsupported Constructs
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.- XOR Operations
- Case Expressions
- List Comprehensions
- Pattern Comprehensions
- Existential Subqueries (e.g. exists)
- Merge Statements
- Unwind Expressions
- Pattern Predicates using Recursive Expansion
Differences between Cypher and CySQL
Translating Cypher to SQL via CySQL comes with a few semantic differences that users should be aware of.Stricter Typing Requirements
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.
Index Utilization
Indexing in CySQL does not require a label specifier to be utilized. If the node propertyname
is indexed in CySQL,
both:
name
index regardless of node label.
null Behavior
Behavior aroundnull
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:
Silent Query Failure
null
can taint result sets and also further complicate future comparisons in the query:
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
.