SlideShare a Scribd company logo
The case for
Regular Path Queries
Tobias Lindaaker @ neo4j
CIR-2017-179
Why should we add Path Queries to Cypher?
● Find complex connections
○ Repetitions of patterns and not just single edge label
○ Alternatives between patterns and not just single edge label
● Express patterns as patterns instead of combinations of queries
(Using UNION to express disjunctions hides what is actually going on)
Path Pattern Queries
RPQs in Cypher
Tobias Lindaaker @ neo4j
CIP 2017-02-06
Path Patterns in Cypher
● Predicates on Edge Label: ()-/:FOO/-()
● Predicates on Nodes: ()-/(:Alpha{beta:'gamma'})/-()
● Alternatives: ()-/:FOO | :BAR | :BAZ/-()
● Sequence: ()-/:FOO :BAR :BAZ/-()
● Grouping: ()-/:FOO | [:BAR :BAZ]/-()
● Direction: ()-/<:FOO :BAR <:BAZ>/->()
● Any Edge: ()-/-/-()
● Repetition: ()-/:FOO? :BAR+ :BAZ* :FOO*3.. :BAR*1..5/-()
● Predicates on Edge Properties: ()-/ [- {some:'value'}] /-()
(applies to all edges matched by the group)
(for more complex predicates use Named Path Patterns)
● Negation: ()-/[^:FOO :BAR]/-()
(negation groups only allows edge labels - no other combinators or properties)
● Named Path Patterns: ()-/~foobar/-()
after declaring: PATH PATTERN foobar = ()-/:FOO :BAR/-()
Example
()-/[^:FOO :BAR]/-()
()-/[^:FOO|:BAR]/-()
()-/~not_foo_or_bar/-()
PATH PATTERN not_foo_or_bar = ()-[x]-()
WHERE label(x) <> 'FOO' AND label(x) <> 'BAR'
Atomic Patterns vs Path Patterns
Edge Patterns are delimited by square brackets [ ... ] and denotes a single edge
Edge Patterns can be used both for matching an edge and for creating an edge
Edge Patterns can bind a matched edge to a variable
Path Patterns are delimited by slashes / ... / and denotes a path of zero or more edges
Path Patterns can only be used for matching paths, and cannot be used for creating entities in a graph
Path Patterns can not bind individual edges (or nodes) to variables
Compared to Regular Expressions (over text)
Regular expression over text
● Atoms: text literals
● Disjunction: |
● Concatenation: juxtaposition
● Grouping: ( ... )
● Quantification:
○ ? - zero or one
○ * - zero or more
○ + - one or more
○ {n,m} - at least n, at most m
● Wildcard: . (any character)
● String start/end
● Disjunction of atoms short form: [ ... ]
● Negation of disjunction of atoms: [^...]
● Greedy, Lazy, Possessive
Cypher Path Patterns
● Atoms: Edge / Node (label) predicates
● Disjunction: |
● Concatenation: juxtaposition
● Grouping: [ ... ]
● Quantification:
○ ? - zero or one
○ * - zero or more
○ + - one or more
○ *n..m - at least n, at most m
● Wildcard: - (any edge)
● not applicable
● not available
● not supported
● not explored
Compared to GXPath (path expressions)
• ε G
- {(v,v) | v ∈ V} - yes: (v)-/()/->(v)
• _ G
- {(v,w)| (v,a,w) ∈ E for some a}
- yes: (v)-/-/->(w)
• a G
- {(v,w)| (v,a,w) ∈ E} - yes: (v)-/:a/->(w)
• a- G
= {(v,w) | (w,a,v) ∈ E} - yes: (v)-/<:a/->(w)
• ɑ* G
= reflexive transitive closure of ɑ
- yes: ()-[ɑ*]->()
• ɑ · β G
= ɑ G
β G
- yes: ()-[ɑ β]->()
• ɑ ∪ β G
= ɑ G
∪ β G
- yes: ()-[ɑ|β]->()
• ¬ɑ G
= V V - ɑ G
- NO! the PATH PATTERN syntax is limited to connected patterns
• [φ] G
= {(v,v) | v ∈ φ G
}
- yes: PATH PATTERN phi = (v) WHERE φ(v)
• ɑn,m G
= ⋃k=n
m
( ɑ G
)k - yes: ()-[ɑ*n..m]->()
• ɑ=
G
= {(v,w) ∈ ɑ=
G
| ρ(v)=ρ(w)}
- yes: PATH PATTERN alpha_eq = (v)-[ɑ]->(w) WHERE v.ρ = w.ρ
• ɑ≠
G
= {(v,w) ∈ ɑ=
G
| ρ(v)≠ρ(w)}
- yes: PATH PATTERN alpha_not_eq = (v)-[ɑ]->(w) WHERE v.ρ <> w.ρ
• Conjunctions (for CRPQs): ɑ ∩ β G
= ɑ G
∪ β G
- yes: PATH PATTERN alpha_and_beta = (v)-[ɑ]->(w)
- yes: WHERE EXISTS { (v)-[β]->(w) }
Cartesian product with negation
MATCH (a), (b)
WHERE NOT EXISTS {
(a)-/.../-(b)
}
Compared to GXPath (node tests)
• ɑ G
= {v | ∃w (v,w) ∈ ɑ G
}
- yes: PATH PATTERN has_alpha = (v) WHERE EXIST { (v)-[ ɑ]->() }
• ¬φ G
= V - φ G
- yes: PATH PATTERN not_phi = (v) WHERE NOT φ(v)
• φ ∧ ψ G
= φ G
∩ ψ G
- yes: PATH PATTERN phi_and_psi = (v) WHERE φ(v) AND ψ(v)
• φ ∨ ψ G
= φ G
∪ ψ G
- yes: PATH PATTERN phi_or_psi = (v) WHERE φ(v) OR ψ(v)
• c= G
= {v ∈ V | ρ(v) = c}
- yes: PATH PATTERN rho_is_c = (v) WHERE v.ρ = c
• c≠ G
= {v ∈ V | ρ(v) ≠ c}
- yes: PATH PATTERN rho_is_not_c = (v) WHERE v.ρ <> c
• ɑ = β G
= {v ∈ V | ∃w,y (v,w)∈ ɑ G
, (v,y)∈ β G
, ρ(w)=ρ(y)}
- yes: PATH PATTERN alpha_eq_beta = (v) WHERE EXIST {
- yes: MATCH (v)-[ ɑ]-(w), (v)-[β]-(y) WHERE w.ρ = y.ρ }
• ɑ ≠ β G
= {v ∈ V | ∃w,y (v,w)∈ ɑ G
, (v,y)∈ β G
, ρ(w)≠ρ(y)}
- yes: PATH PATTERN alpha_not_eq_beta = (v) WHERE EXIST {
- yes: MATCH (v)-[ ɑ]-(w), (v)-[β]-(y) WHERE w.ρ <> y.ρ }
Paths where property value differs from first
PATH PATTERN not_first_foo = (first)-/-*/-()
WHERE all( n IN nodes(not_first_foo)
WHERE n = first OR n.foo <> first.foo )
MATCH x = (a)-/~not_first_foo/-(b)
RETURN a, b, length(x)
Remaining work
● Incorporate negation into CIP
● Comparison with Conjunctive Context-Free Path Queries
● Are there things we can express in Named Path Patterns (WHERE) that cannot be implemented
using REMs?
● Make sure that the referenced papers are linked from the CIP
● Idea: :- instead of - for (edge label) wildcard
● Binding groups (paths), a better syntax than:
PATH PATTERN foo = ()-[x]-(b), p=(b)-/-*/-()
(at least a discussion section on it - either including or explaining why not)
○ Can we use bare words for that?
● Quite possibly juxtaposition will be used elsewhere for conjunction
so perhaps we should allow that here as well, and use a separate operator for sequences
Further reading
● The Cypher Improvement Proposal: CIP 2017-02-06 (rendered text)
● Presentation from oCIM 1
● Short presentation on Path Patterns
● Presentation from oCIM 2

More Related Content

PDF
Single source shortes path in dag
PDF
String Matching with Finite Automata and Knuth Morris Pratt Algorithm
PDF
Bellman ford
PDF
Longest common subsequence
PPT
Algorithm Design and Complexity - Course 8
PDF
Johnson's algorithm
PPT
Algorithm Design and Complexity - Course 9
PDF
My presentation all shortestpath
Single source shortes path in dag
String Matching with Finite Automata and Knuth Morris Pratt Algorithm
Bellman ford
Longest common subsequence
Algorithm Design and Complexity - Course 8
Johnson's algorithm
Algorithm Design and Complexity - Course 9
My presentation all shortestpath

What's hot (20)

PDF
Topological sorting
PDF
Algorithm Design and Complexity - Course 12
PPTX
12 derivatives and integrals of inverse trigonometric functions x
PPTX
11 the inverse trigonometric functions x
PPT
Lect7
PDF
Lesson 8: Curves, Arc Length, Acceleration
PPTX
Bezier Curve(Computer Graphics)
PPTX
GRAPH APPLICATION - MINIMUM SPANNING TREE (MST)
PPTX
Minimum spanning tree algorithms by ibrahim_alfayoumi
PDF
Minimum spanning tree
PPTX
8 arc length and area of surfaces x
PPTX
Prims and kruskal algorithms
PDF
Introduccio al calculo vectorial
PDF
Graph for Coulomb damped oscillation
PDF
Dokumen.tips mathematics ii-institute-of-aeronautical-engineering-pptpdfadvan...
PPTX
1.7 derivative
PDF
Hermite cubic spline curve
PDF
Directional derivative and gradient
DOCX
Unit 2 analysis of continuous time signals-mcq questions
PPTX
Fuzzy rules and fuzzy reasoning
Topological sorting
Algorithm Design and Complexity - Course 12
12 derivatives and integrals of inverse trigonometric functions x
11 the inverse trigonometric functions x
Lect7
Lesson 8: Curves, Arc Length, Acceleration
Bezier Curve(Computer Graphics)
GRAPH APPLICATION - MINIMUM SPANNING TREE (MST)
Minimum spanning tree algorithms by ibrahim_alfayoumi
Minimum spanning tree
8 arc length and area of surfaces x
Prims and kruskal algorithms
Introduccio al calculo vectorial
Graph for Coulomb damped oscillation
Dokumen.tips mathematics ii-institute-of-aeronautical-engineering-pptpdfadvan...
1.7 derivative
Hermite cubic spline curve
Directional derivative and gradient
Unit 2 analysis of continuous time signals-mcq questions
Fuzzy rules and fuzzy reasoning
Ad

Similar to openCypher: Further Developments on Path Pattern Queries (Regular Path Queries) (20)

PDF
Path Pattern Queries: Introducing Regular Path Queries in openCypher
PDF
Configurable Pattern Matching Semantics in openCypher: Defining Levels of Nod...
PDF
Future features for openCypher: Schema, Constraints, Subqueries, Configurable...
PDF
8th TUC Meeting - Peter Boncz (CWI). Query Language Task Force status
PDF
Incremental Graph Queries for Cypher
PDF
The inGraph project and incremental evaluation of Cypher queries
PDF
Lighthouse: Large-scale graph pattern matching on Giraph
PDF
Lighthouse: Large-scale graph pattern matching on Giraph
PDF
Fosdem 2013 petra selmer flexible querying of graph data
PDF
Formal methods 4 - Z notation
PDF
Learning Timed Automata with Cypher
PPTX
The openCypher Project - An Open Graph Query Language
PDF
Fog City Ruby - Triple Equals Black Magic with speaker notes
PDF
Incremental View Maintenance for openCypher Queries
PDF
Incremental View Maintenance for openCypher Queries
PDF
The 2nd graph database in sv meetup
PDF
Scala: Pattern matching, Concepts and Implementations
PPTX
TREE ADT, TREE TRAVERSALS, BINARY TREE ADT
PPTX
Final slide4 (bsc csit) chapter 4
PPTX
CS2303-TOC.pptx
Path Pattern Queries: Introducing Regular Path Queries in openCypher
Configurable Pattern Matching Semantics in openCypher: Defining Levels of Nod...
Future features for openCypher: Schema, Constraints, Subqueries, Configurable...
8th TUC Meeting - Peter Boncz (CWI). Query Language Task Force status
Incremental Graph Queries for Cypher
The inGraph project and incremental evaluation of Cypher queries
Lighthouse: Large-scale graph pattern matching on Giraph
Lighthouse: Large-scale graph pattern matching on Giraph
Fosdem 2013 petra selmer flexible querying of graph data
Formal methods 4 - Z notation
Learning Timed Automata with Cypher
The openCypher Project - An Open Graph Query Language
Fog City Ruby - Triple Equals Black Magic with speaker notes
Incremental View Maintenance for openCypher Queries
Incremental View Maintenance for openCypher Queries
The 2nd graph database in sv meetup
Scala: Pattern matching, Concepts and Implementations
TREE ADT, TREE TRAVERSALS, BINARY TREE ADT
Final slide4 (bsc csit) chapter 4
CS2303-TOC.pptx
Ad

More from openCypher (20)

PDF
Learning Timed Automata with Cypher
PDF
Formal semantics for Cypher queries and updates
PDF
Cypher.PL: an executable specification of Cypher semantics
PDF
Multiple Graphs: Updatable Views
PDF
Micro-Servicing Linked Data
PDF
Graph abstraction
PDF
From Cypher 9 to GQL: Conceptual overview of multiple named graphs and compos...
PDF
Cypher for Gremlin
PDF
Comparing PGQL, G-Core and Cypher
PDF
Multiple graphs in openCypher
PDF
Eighth openCypher Implementers Group Meeting: Status Update
PDF
Cypher for Gremlin
PDF
Supporting dates and times in Cypher
PDF
Seventh openCypher Implementers Group Meeting: Status Update
PDF
Academic research on graph processing: connecting recent findings to industri...
PDF
Property Graphs with Time
PDF
Cypher.PL: Executable Specification of Cypher written in Prolog
PDF
Use case: processing multiple graphs
PDF
openCypher Technology Compatibility Kit (TCK)
PDF
Cypher Editor in the Web
Learning Timed Automata with Cypher
Formal semantics for Cypher queries and updates
Cypher.PL: an executable specification of Cypher semantics
Multiple Graphs: Updatable Views
Micro-Servicing Linked Data
Graph abstraction
From Cypher 9 to GQL: Conceptual overview of multiple named graphs and compos...
Cypher for Gremlin
Comparing PGQL, G-Core and Cypher
Multiple graphs in openCypher
Eighth openCypher Implementers Group Meeting: Status Update
Cypher for Gremlin
Supporting dates and times in Cypher
Seventh openCypher Implementers Group Meeting: Status Update
Academic research on graph processing: connecting recent findings to industri...
Property Graphs with Time
Cypher.PL: Executable Specification of Cypher written in Prolog
Use case: processing multiple graphs
openCypher Technology Compatibility Kit (TCK)
Cypher Editor in the Web

Recently uploaded (20)

PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
cuic standard and advanced reporting.pdf
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Approach and Philosophy of On baking technology
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PPTX
Cloud computing and distributed systems.
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
MYSQL Presentation for SQL database connectivity
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
KodekX | Application Modernization Development
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Encapsulation_ Review paper, used for researhc scholars
Reach Out and Touch Someone: Haptics and Empathic Computing
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
cuic standard and advanced reporting.pdf
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
The AUB Centre for AI in Media Proposal.docx
Unlocking AI with Model Context Protocol (MCP)
Approach and Philosophy of On baking technology
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Cloud computing and distributed systems.
Mobile App Security Testing_ A Comprehensive Guide.pdf
20250228 LYD VKU AI Blended-Learning.pptx
Network Security Unit 5.pdf for BCA BBA.
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Per capita expenditure prediction using model stacking based on satellite ima...
MYSQL Presentation for SQL database connectivity
NewMind AI Weekly Chronicles - August'25 Week I
KodekX | Application Modernization Development

openCypher: Further Developments on Path Pattern Queries (Regular Path Queries)

  • 1. The case for Regular Path Queries Tobias Lindaaker @ neo4j CIR-2017-179
  • 2. Why should we add Path Queries to Cypher? ● Find complex connections ○ Repetitions of patterns and not just single edge label ○ Alternatives between patterns and not just single edge label ● Express patterns as patterns instead of combinations of queries (Using UNION to express disjunctions hides what is actually going on)
  • 3. Path Pattern Queries RPQs in Cypher Tobias Lindaaker @ neo4j CIP 2017-02-06
  • 4. Path Patterns in Cypher ● Predicates on Edge Label: ()-/:FOO/-() ● Predicates on Nodes: ()-/(:Alpha{beta:'gamma'})/-() ● Alternatives: ()-/:FOO | :BAR | :BAZ/-() ● Sequence: ()-/:FOO :BAR :BAZ/-() ● Grouping: ()-/:FOO | [:BAR :BAZ]/-() ● Direction: ()-/<:FOO :BAR <:BAZ>/->() ● Any Edge: ()-/-/-() ● Repetition: ()-/:FOO? :BAR+ :BAZ* :FOO*3.. :BAR*1..5/-() ● Predicates on Edge Properties: ()-/ [- {some:'value'}] /-() (applies to all edges matched by the group) (for more complex predicates use Named Path Patterns) ● Negation: ()-/[^:FOO :BAR]/-() (negation groups only allows edge labels - no other combinators or properties) ● Named Path Patterns: ()-/~foobar/-() after declaring: PATH PATTERN foobar = ()-/:FOO :BAR/-()
  • 5. Example ()-/[^:FOO :BAR]/-() ()-/[^:FOO|:BAR]/-() ()-/~not_foo_or_bar/-() PATH PATTERN not_foo_or_bar = ()-[x]-() WHERE label(x) <> 'FOO' AND label(x) <> 'BAR'
  • 6. Atomic Patterns vs Path Patterns Edge Patterns are delimited by square brackets [ ... ] and denotes a single edge Edge Patterns can be used both for matching an edge and for creating an edge Edge Patterns can bind a matched edge to a variable Path Patterns are delimited by slashes / ... / and denotes a path of zero or more edges Path Patterns can only be used for matching paths, and cannot be used for creating entities in a graph Path Patterns can not bind individual edges (or nodes) to variables
  • 7. Compared to Regular Expressions (over text) Regular expression over text ● Atoms: text literals ● Disjunction: | ● Concatenation: juxtaposition ● Grouping: ( ... ) ● Quantification: ○ ? - zero or one ○ * - zero or more ○ + - one or more ○ {n,m} - at least n, at most m ● Wildcard: . (any character) ● String start/end ● Disjunction of atoms short form: [ ... ] ● Negation of disjunction of atoms: [^...] ● Greedy, Lazy, Possessive Cypher Path Patterns ● Atoms: Edge / Node (label) predicates ● Disjunction: | ● Concatenation: juxtaposition ● Grouping: [ ... ] ● Quantification: ○ ? - zero or one ○ * - zero or more ○ + - one or more ○ *n..m - at least n, at most m ● Wildcard: - (any edge) ● not applicable ● not available ● not supported ● not explored
  • 8. Compared to GXPath (path expressions) • ε G - {(v,v) | v ∈ V} - yes: (v)-/()/->(v) • _ G - {(v,w)| (v,a,w) ∈ E for some a} - yes: (v)-/-/->(w) • a G - {(v,w)| (v,a,w) ∈ E} - yes: (v)-/:a/->(w) • a- G = {(v,w) | (w,a,v) ∈ E} - yes: (v)-/<:a/->(w) • ɑ* G = reflexive transitive closure of ɑ - yes: ()-[ɑ*]->() • ɑ · β G = ɑ G β G - yes: ()-[ɑ β]->() • ɑ ∪ β G = ɑ G ∪ β G - yes: ()-[ɑ|β]->() • ¬ɑ G = V V - ɑ G - NO! the PATH PATTERN syntax is limited to connected patterns • [φ] G = {(v,v) | v ∈ φ G } - yes: PATH PATTERN phi = (v) WHERE φ(v) • ɑn,m G = ⋃k=n m ( ɑ G )k - yes: ()-[ɑ*n..m]->() • ɑ= G = {(v,w) ∈ ɑ= G | ρ(v)=ρ(w)} - yes: PATH PATTERN alpha_eq = (v)-[ɑ]->(w) WHERE v.ρ = w.ρ • ɑ≠ G = {(v,w) ∈ ɑ= G | ρ(v)≠ρ(w)} - yes: PATH PATTERN alpha_not_eq = (v)-[ɑ]->(w) WHERE v.ρ <> w.ρ • Conjunctions (for CRPQs): ɑ ∩ β G = ɑ G ∪ β G - yes: PATH PATTERN alpha_and_beta = (v)-[ɑ]->(w) - yes: WHERE EXISTS { (v)-[β]->(w) }
  • 9. Cartesian product with negation MATCH (a), (b) WHERE NOT EXISTS { (a)-/.../-(b) }
  • 10. Compared to GXPath (node tests) • ɑ G = {v | ∃w (v,w) ∈ ɑ G } - yes: PATH PATTERN has_alpha = (v) WHERE EXIST { (v)-[ ɑ]->() } • ¬φ G = V - φ G - yes: PATH PATTERN not_phi = (v) WHERE NOT φ(v) • φ ∧ ψ G = φ G ∩ ψ G - yes: PATH PATTERN phi_and_psi = (v) WHERE φ(v) AND ψ(v) • φ ∨ ψ G = φ G ∪ ψ G - yes: PATH PATTERN phi_or_psi = (v) WHERE φ(v) OR ψ(v) • c= G = {v ∈ V | ρ(v) = c} - yes: PATH PATTERN rho_is_c = (v) WHERE v.ρ = c • c≠ G = {v ∈ V | ρ(v) ≠ c} - yes: PATH PATTERN rho_is_not_c = (v) WHERE v.ρ <> c • ɑ = β G = {v ∈ V | ∃w,y (v,w)∈ ɑ G , (v,y)∈ β G , ρ(w)=ρ(y)} - yes: PATH PATTERN alpha_eq_beta = (v) WHERE EXIST { - yes: MATCH (v)-[ ɑ]-(w), (v)-[β]-(y) WHERE w.ρ = y.ρ } • ɑ ≠ β G = {v ∈ V | ∃w,y (v,w)∈ ɑ G , (v,y)∈ β G , ρ(w)≠ρ(y)} - yes: PATH PATTERN alpha_not_eq_beta = (v) WHERE EXIST { - yes: MATCH (v)-[ ɑ]-(w), (v)-[β]-(y) WHERE w.ρ <> y.ρ }
  • 11. Paths where property value differs from first PATH PATTERN not_first_foo = (first)-/-*/-() WHERE all( n IN nodes(not_first_foo) WHERE n = first OR n.foo <> first.foo ) MATCH x = (a)-/~not_first_foo/-(b) RETURN a, b, length(x)
  • 12. Remaining work ● Incorporate negation into CIP ● Comparison with Conjunctive Context-Free Path Queries ● Are there things we can express in Named Path Patterns (WHERE) that cannot be implemented using REMs? ● Make sure that the referenced papers are linked from the CIP ● Idea: :- instead of - for (edge label) wildcard ● Binding groups (paths), a better syntax than: PATH PATTERN foo = ()-[x]-(b), p=(b)-/-*/-() (at least a discussion section on it - either including or explaining why not) ○ Can we use bare words for that? ● Quite possibly juxtaposition will be used elsewhere for conjunction so perhaps we should allow that here as well, and use a separate operator for sequences
  • 13. Further reading ● The Cypher Improvement Proposal: CIP 2017-02-06 (rendered text) ● Presentation from oCIM 1 ● Short presentation on Path Patterns ● Presentation from oCIM 2