cypher

package module
v0.0.0-...-05a0b4d Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 1, 2023 License: BSD-3-Clause Imports: 3 Imported by: 1

README

Work in progress

This project just started, it hardly works.

openCypher parser

This is a parser for openCypher. The parser follows Cypher Query Language Reference, Version 9 most the time, here are intended differences:

  • Tokens are ASCII strings, however the spec allows Unicode chars. In property strings using Unicode is allowed, but not in labels, relation names, variables etc. No quoting allowed.
  • Patterns supplied to CREATE may use a single parameter to specify properties, e.g: CREATE (node $paramName). This is not allowed.
  • CASE parsing...

The rest is just bug, feel free to report them.

Thanks To

Alec Thomas for participle

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Build

func Build() (*participle.Parser[Cypher], error)

Types

type Atom

type Atom struct {
	Literal   *Literal `parser:"(  @@"`
	Parameter string   `parser:"| @('$' (SymbolicName|DecimalInteger) )"`
	// CaseExpression
	// COUNT...
	// ListComprehension
	// PatternComprehension
	// ALL...
	// ANY...
	// NONE...
	// SINGLE...
	Relationship *RelationshipPattern `parser:"| @@"`
	Expression   *Expression          `parser:"| '(' @@ ')'"`
	Function     *FunctionInvocation  `parser:"| @@"`
	Variable     string               `parser:"| @SymbolicName )!"`
}

type ComparisonExpression

type ComparisonExpression struct {
	AOS1     *MathExpression `parser:"@@"`
	Relation string          `parser:"( ('=' | '<>' | '<=' | '>=' | '<' | '>')!"`
	AOS2     *MathExpression `parser:"@@ )*"`
}

type Create

type Create struct {
	Path []*Path `parser:"@@ (',' @@)*"`
}

type Cypher

type Cypher struct {
	Queries []*Query `parser:"@@*"`
}

type Debug

type Debug struct {
	Pos    lexer.Position
	EndPos lexer.Position
	Tokens []lexer.Token
}

type Entity

type Entity struct {
	Node     *Node                `parser:"'(' @@* ')'"` // @@* as empty node is valid
	Relation *RelationshipPattern `parser:"| @@"`
}

type Expression

type Expression struct {
	E *OrXorAndNotExpression `parser:"@@"`
}

type FunctionInvocation

type FunctionInvocation struct {
	// FunctionName string `parser:"( ( @(SymbolicName '.')* @SymbolicName ) | 'EXISTS' )!"`
	FunctionName string        `parser:"( ( @SymbolicName ) | 'EXISTS' )!"`
	Expression   []*Expression `parser:"'(' 'DISTINCT'? @@? (',' @@)* ')'"`
}

type Literal

type Literal struct {
	NumberLiteral  string        `parser:"  @(Float|HexInteger|OctalInteger|DecimalInteger)"`
	StringLiteral  string        `parser:"| @StringLiteral"`
	BooleanLiteral string        `parser:"| @BooleanLiteral"`
	Null           string        `parser:"| 'null'"`
	MapLiteral     []*MapLiteral `parser:"| '{' @@ (',' @@)* '}'"`
}

type MapLiteral

type MapLiteral struct {
	Key string      `parser:"@SymbolicName ':'"`
	E   *Expression `parser:"@@"`
}

type Match

type Match struct {
	Path  []*Path `parser:"@@ (',' @@)*"`
	Where *Where  `parser:"('WHERE' @@)?"`
}

type MathExpression

type MathExpression struct {
	Add   *StringListNullOperatorExpression `parser:"  '+' @@"`
	Subs  *StringListNullOperatorExpression `parser:"| '-' @@"`
	Mult  *StringListNullOperatorExpression `parser:"| '*' @@"`
	Div   *StringListNullOperatorExpression `parser:"| '/' @@"`
	Mod   *StringListNullOperatorExpression `parser:"| '%' @@"`
	Pow   *StringListNullOperatorExpression `parser:"| '^' @@"`
	SLNOE *StringListNullOperatorExpression `parser:"| @@"`
}

type Node

type Node struct {
	Variable string    `parser:"@SymbolicName?"`                       // 0 or 1 variable
	Labels   []string  `parser:"(':' @(SymbolicName|ReservedWord) )*"` // 0 or more labels
	Prop     *Property `parser:"@@?"`
}

type OrXorAndNotExpression

type OrXorAndNotExpression struct {
	OR   *ComparisonExpression `parser:"  'OR' @@"`
	XOR  *ComparisonExpression `parser:"| 'XOR' @@"`
	AND  *ComparisonExpression `parser:"| 'AND' @@"`
	NOT  *ComparisonExpression `parser:"| 'NOT' @@"`
	COMP *ComparisonExpression `parser:"| @@"`
}

type Path

type Path struct {
	Entities []*Entity `parser:"@@+"`
}

type ProjectionBody

type ProjectionBody struct {
	PIS   *ProjectionItems `parser:"'DISTINCT'? @@"`
	Skip  *Expression      `parser:"('SKIP' @@)?"`
	Limit *Expression      `parser:"('LIMIT' @@)?"`
}

type ProjectionItem

type ProjectionItem struct {
	Expression *Expression `parser:"@@"`
	AsVariable string      `parser:"('AS' @SymbolicName)?"`
}

type ProjectionItems

type ProjectionItems struct {
	PI []*ProjectionItem `parser:"('*'|@@) (',' @@)*"`
}

type Property

type Property struct {
	MapLiteral []*MapLiteral `parser:"'{' @@ (',' @@)* '}'"`
	Parameter  string        `parser:"| @('$' (SymbolicName|DecimalInteger) )"`
}

type PropertyExpression

type PropertyExpression struct {
	Atom           *Atom  `parser:"@@"`
	PropertyLookup string `parser:"('.' @(SymbolicName|ReservedWord) )+"`
}

PropertyExpression needs at least one propery

type PropertyOrLabelsExpression

type PropertyOrLabelsExpression struct {
	Atom           *Atom    `parser:"@@"`
	PropertyLookup string   `parser:"('.' @(SymbolicName|ReservedWord) )*"`
	Labels         []string `parser:"(':' @(SymbolicName|ReservedWord) )*"`
}

PropertyOrLabelsExpression can omit property

type Query

type Query struct {
	Version string  `parser:"('CYPHER' @DecimalInteger)?"`
	Create  *Create `parser:"('CREATE' @@)*"`
	Match   *Match  `parser:"('OPTIONAL'? 'MATCH' @@)*"`
	With    *With   `parser:"('WITH' @@)*"`
	Return  *Return `parser:"('RETURN' @@)*"`
	Set     *Set    `parser:"('SET' @@)*"`
}

type RelationshipDetail

type RelationshipDetail struct {
	Variable     string    `parser:"@SymbolicName?"`
	RelType      []string  `parser:"(':' @(SymbolicName|ReservedWord) )? ('|' ':'? @(SymbolicName|ReservedWord) )*"`
	RangeLiteral string    `parser:"('*' @(HexInteger|OctalInteger|DecimalInteger)? @('.' '.')? @(HexInteger|OctalInteger|DecimalInteger)* )?"`
	Prop         *Property `parser:"@@?"`
}

type RelationshipPattern

type RelationshipPattern struct {
	Pre  string              `parser:"@('<')? '-'"`
	RD   *RelationshipDetail `parser:"'[' @@? ']'"`
	Post string              `parser:"'-' @('>')?"`
}

type Return

type Return struct {
	PB *ProjectionBody `parser:"@@"`
}

type Set

type Set struct {
	Items []*SetItem `parser:"@@ (',' @@)*"`
}

type SetItem

type SetItem struct {
	Property   *PropertyExpression `parser:"( (   ( @@ '=' )"`
	Variable   string              `parser:"  | ( @SymbolicName ('='|'+=') ) )!"`
	Expression *Expression         `parser:"@@ )"`

	Variable2  string   `parser:"| ( @SymbolicName"`
	NodeLabels []string `parser:"(':' @(SymbolicName|ReservedWord) )+ )"`
}

type StringListNullOperatorExpression

type StringListNullOperatorExpression struct {
	POL *PropertyOrLabelsExpression `parser:"@@"`
}

type Where

type Where struct {
	E *Expression `parser:"@@"`
}

type With

type With struct {
	PB    *ProjectionBody `parser:"@@"`
	Where *Where          `parser:"('WHERE' @@)?"`
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL