5 days agoAllow global graph contexts to see currentCommandIds master
John Gemignani [Thu, 19 May 2022 16:51:45 +0000 (09:51 -0700)] 
Allow global graph contexts to see currentCommandIds

Allow the global graph contexts to see the curcid - the snapshot
copy of currentCommandId for that snapshot.

This will allow the contexts to be refreshed, as needed, inside
BEGIN/COMMIT blocks. This problem was brought up in issue #217

Added regression tests.

2 weeks agoFix Bug in WHERE clause and property contraints
Josh Innis [Wed, 11 May 2022 02:45:56 +0000 (19:45 -0700)] 
Fix Bug in WHERE clause and property contraints

When the property contraints and the where clause are used together,
the property contraints are ignored.

There was a second issue where the where clause needs to be coerced to a
boolean value before ANDed with the property constraint quals

2 weeks agoFix bug in aggregate function collect()
John Gemignani [Tue, 10 May 2022 19:03:44 +0000 (12:03 -0700)] 
Fix bug in aggregate function collect()

Fixes a bug where the collect functions aggtransfn is not called but
the aggfinalfn is. While I'm not sure why this case happens, as it
'should' always call the aggtransfn, it crashes because the collect
aggregate state (castate) hasn't been initialized and is still null.

The fix is to have the aggfinalfn check for a null state and create
the state for finalizing the empty '[]' results.

Added a regression test for this case.

2 weeks agoAdd access operator (`->`, `->>`) to Agtype (#212)
Alex Kwak [Fri, 6 May 2022 23:43:45 +0000 (08:43 +0900)] 
Add access operator (`->`, `->>`) to Agtype (#212)

* Add access operator (`->`, `->>`) to Agtype

Added the `->`, `->>` operator to agtype for approaching like Json(b).

2 weeks agoImprove Where clause performance and supoort Index Scans
Josh Innis [Fri, 6 May 2022 21:28:15 +0000 (14:28 -0700)] 
Improve Where clause performance and supoort Index Scans

Improve the evaluation of qual in the WHERE clause by referencing
the properties column in the underlying table, rather than having
to go through the constructed variable for the entity.

Allow the access operator to be used in index construction.

Modify the inderection logic to be capable of using indices,
if they exist.

2 weeks agoVLE path variable integration performance patch
John Gemignani [Sat, 23 Apr 2022 00:44:11 +0000 (17:44 -0700)] 
VLE path variable integration performance patch

This patch fixes 2 cases where the match terminal edge logic
for the VLE integration into a match shouldn't be called for a path
variable. The cases are as follows -

    1) p=()-[*]-(), p=()-[*]->(), p=()<-[*]-()
    2) p=(u)-[*]-(), p=(u)-[*]->(), p=(u)<-[*]-()

Note: This is for any length of VLE edge, not just *

Note: It may be possible to expand this to other cases. This is left
      for a potential future patch.

In the cases listed above, this decreases the execution speed by
orders of magnitude.

There are no impact on regression tests.

2 weeks agoAdd CALL [YIELD] grammar rules
Dehowe Feng [Thu, 5 May 2022 00:20:37 +0000 (17:20 -0700)] 
Add CALL [YIELD] grammar rules

Add call ...[yield] grammar rules for the implementation of
CALL procedures.

3 weeks agoModify Docker url
Josh Innis [Thu, 28 Apr 2022 18:16:30 +0000 (11:16 -0700)] 
Modify Docker url

Modify the Docker urls to point to the Apache docker image

4 weeks agoSupport for Agtype Containment Ops and GIN Indices
Josh Innis [Mon, 25 Apr 2022 18:13:16 +0000 (11:13 -0700)] 
Support for Agtype Containment Ops and GIN Indices

Add support for @>, <@, ?, ?|, ?& operators postgres operators.

Alter property contraint checks in MATCH clause to use the @>  operator.

Add support for GIN Indices

4 weeks agoCache AGTYPE and GRAPHID Oids
John Gemignani [Thu, 21 Apr 2022 00:36:08 +0000 (17:36 -0700)] 

Set up caching mechanism for AGTYPE and GRAPHID Oids.

Previously these were set up as #define statements that used syscache
lookups, as these are all dynamically allocated.

They are now set up to use global variables to hold the values, after
the first lookup, to enable faster lookups.

No regression tests were affected.

4 weeks agoAllow lists and maps to be used in the SET clause
Josh Innis [Thu, 21 Apr 2022 17:13:28 +0000 (10:13 -0700)] 
Allow lists and maps to be used in the SET clause

Patch fixes a bug that did not allow lists or maps
to be used in the SET clause properly.

Optimized some code in the SET clause.

Code cleanup and documenation added too.

4 weeks agoUpdates to 1.0.0 (#197)
Nick Sorrell [Thu, 21 Apr 2022 11:48:06 +0000 (07:48 -0400)] 
Updates to 1.0.0 (#197)

* Updates to 1.0.0

* Updating copyright date in notice

5 weeks agoFix global graph hashtable insert messaging
John Gemignani [Tue, 19 Apr 2022 20:41:23 +0000 (13:41 -0700)] 
Fix global graph hashtable insert messaging

Fixed the global graph hashtable routines to error out, instead of
crashing due to an assert, for duplicate ids.

6 weeks agochore: (Docker) Removing upstream clone and unneeded dependencies (#205)
Nick Sorrell [Mon, 11 Apr 2022 05:29:50 +0000 (01:29 -0400)] 
chore: (Docker) Removing upstream clone and unneeded dependencies (#205)

Currently, Dockerfile always cloning repository with master branch.
so, it always build of master. and, difficult to configure a proper
Docker CD environment

Therefore, makes to build Dockerfile by copying current directories
without doing clone. according to this change, remove unneeded

6 weeks agoAdd chained comparisons to openCypher
John Gemignani [Thu, 7 Apr 2022 22:13:32 +0000 (15:13 -0700)] 
Add chained comparisons to openCypher

Added chained comparisons to AGE's openCypher specification.

Added regression tests.

6 weeks agoImprove Performance of MATCH and support Indices in Queries
Josh Innis [Wed, 6 Apr 2022 15:31:54 +0000 (08:31 -0700)] 
Improve Performance of MATCH and support Indices in Queries

Change the logic that constructs the join tree in a match to  use the id,
start_id, and end_ids as the graphid type, rather than using Agtype, this will
save time for every row qual check by skipping unneeded processing time to
convert graphids to agtype when it is not necessary.

Change the functions used by match to check that the output is  correct will now
accept graphids and agtype, which will improve performance.

Enable graphids to be used in hash joins and merge joins, this will allow the
optimizer to choose more efficient query plans in the planner/optimization

Fix a bug in the cypher writing clauses, that allow them to support updating
indices. This allows users to build indices that would allow for more efficient
queries. Such as using Index scans instead of sequence scans and make for more
opportunities for merge joins to be a better option for the planner, which
combines the time complexity of hash joins, with the space complexity of nested
loop joins. Nested loop joins also have the opportunity of using index scans
which will also improve performance.

7 weeks agoFix chained unions returning unexpected results
Dehowe Feng [Thu, 31 Mar 2022 21:16:26 +0000 (14:16 -0700)] 
Fix chained unions returning unexpected results

Rewrote the union logic to integrate union set operation values
into the cypher_return node. Removed the cypher_union ag node to be
more in line with the postgresql implementation.

Altered the grammar to utilize the make_set_op function for future
set operations if necessary. Also changed query_list rule to
cypher_stmt for more clarity.

Refactored logic surrounding isLeaf in transform_cypher_union_tree
to have the function call tree be more congruent with the postgres
function tree.

Fixed a bug where chained union operations resulted in unexpected

Also fixed minor grammatical errors in comments and style issues.

7 weeks agoVLE memory usage bug fixes
John Gemignani [Thu, 24 Mar 2022 01:01:33 +0000 (18:01 -0700)] 
VLE memory usage bug fixes

Added some bug fixes to the VLE memory management system.

Moved the age_vertex_stats function to global_graph.

8 weeks agoImprove performance of VLE cases
Josh Innis [Fri, 25 Mar 2022 19:27:57 +0000 (12:27 -0700)] 
Improve performance of VLE cases

For some MATCH queries that use the VLE, there where unecessary
comparisons to ensure the correct output was generated. When the vertex
after the vle edge is not included in the query, the
age_match_vle_terminal_edge function does not need to be called.

MATCH (a)-[e*1..5]->() RETURN a, e;

2 months agoFix Simple Undirected MATCH Case
Josh Innis [Wed, 23 Mar 2022 22:39:59 +0000 (15:39 -0700)] 
Fix Simple Undirected MATCH Case

When a MATCH has two vertices and an undirected edge, where no
information was referenced in the two vertices, such as:

MATCH ()-[e]-() RETURN e;

Only half the number of rows were returned from what was expected.
Every  edge should be included twice, once for each direction.

2 months agoFix small memory leak in VLE
John Gemignani [Tue, 22 Mar 2022 19:53:36 +0000 (12:53 -0700)] 
Fix small memory leak in VLE

Fixed a small memory leak in the VLE. A character string for the edge
lable name in the local VLE context was not getting freed.

2 months agoAdd VLE performance enhancements
John Gemignani [Thu, 10 Mar 2022 22:14:36 +0000 (14:14 -0800)] 
Add VLE performance enhancements

Added to the VLE code a local context LRU cache to improve

The following command demonstrates an issue with the VLE and
SRFs -

    MATCH (u)-[*]-() RETURN COUNT(1);

This command will repeatedly call the VLE SRF with different
starting vertices until all vertices matching u are exhausted.
However, the issue is, each of these vertices will initiate a
new SRF call - not a continuation of the same SRF. These new
calls have to rebuild all of the local structures for the same
VLE grammar node. This ends up taking a lot of time and resources.

To resolve this a simple LRU based cache was added for these local
VLE contexts and keyed on the grammar node id. This id was added so
that each VLE grammar node would be unique and therefore, reusable
for repeated calls using the same grammar node.

Added split edge lists for the edges stored for each vertex. This
comprises 3 edge lists to improve performance for directional cases.

Originally, all edges entering and exiting a vertex were stored in
the 'edges' list. Now the edges are stored in edges_in, edges_out,
and edges_self. This allows directed searchs to avoid checking edges
that don't meet the direction criteria.

Added new logic for matching an edge in function is_an_edge_match.
It now uses agtype_deep_contains for comparisons.

Added the cypher function age_vertex_stats which will return vertex
statistics. This function is helpful for debugging graphs.

Added a grammar rule to allow functions to be used as the parent of
an indirection. As in the following example -

    MATCH (u) WHERE vertex_stats(u).in_degree > 10 RETURN vertex_stats(u);

Additionally, a few small memory leaks were fixed.

Added regression tests.

All previous regression tests passed.

2 months agoAdd ASF license to upgrade scripts
John Gemignani [Tue, 8 Mar 2022 17:29:08 +0000 (09:29 -0800)] 
Add ASF license to upgrade scripts

Added the ASF license to the upgrade scripts.

Minor formatting of contents.

2 months agoAdding a upgrading SQL script file from 0.5.0 to 0.6.0 (#190)
Quoc Viet Vuong [Tue, 8 Mar 2022 16:45:47 +0000 (23:45 +0700)] 
Adding a upgrading SQL script file from 0.5.0 to 0.6.0 (#190)

2 months agoAdd upgrading file age--0.7.0--1.0.0.sql (#191)
Quoc Viet Vuong [Fri, 4 Mar 2022 23:05:49 +0000 (06:05 +0700)] 
Add upgrading file age--0.7.0--1.0.0.sql (#191)

Add upgrading file age--0.6.0--0.7.0.sql

2 months agoRefactor function get_agtype_value_object_value
John Gemignani [Wed, 2 Mar 2022 00:44:31 +0000 (16:44 -0800)] 
Refactor function get_agtype_value_object_value

Refactored the function get_agtype_value_object_value to use binary
search to find the specified key. Previously it just did a linear
seach through the keys.

Removed the function get_agtype_key as it was redundant.

Added the macro GET_AGTYPE_VALUE_OBJECT_VALUE for usage with string
constants. Thank you Alex!

Replaced all occurrences of get_agtype_key to use either the
get_agtype_value_object_value or GET_AGTYPE_VALUE_OBJECT_VALUE
calls, depending on whether string constants were used or not.

Adjusted all calls to get_agtype_value_object_value due to the
addition of a length parameter.

All regression tests succeeded.

2 months agoChange version from 0.7.0 to 1.0.0
Josh Innis [Wed, 2 Mar 2022 23:00:05 +0000 (15:00 -0800)] 
Change version from 0.7.0 to 1.0.0

2 months agoAge load issue (#188)
Shoaib [Wed, 2 Mar 2022 19:09:44 +0000 (20:09 +0100)] 
Age load issue (#188)

Refactored the agtype_access_operator and support functions to
eliminate the constant conversions back-and-forth.

Integrated the bulk import tool into AGE.

Also corrected the response to AGTV_NULL

Moved get_agtype_key from age_vle.c to agtype.c for usage by

Adjusted 2 regression tests.

Co-authored-by: John Gemignani <>
2 months agoRefactor agtype_access_operator
John Gemignani [Fri, 25 Feb 2022 01:01:34 +0000 (17:01 -0800)] 
Refactor agtype_access_operator

Refactored the agtype_access_operator and support functions to
eliminate the constant conversions back-and-forth.

Also corrected the response to AGTV_NULL

Moved get_agtype_key from age_vle.c to agtype.c for usage by

Adjusted 2 regression tests.

3 months agoBugfix - Remove INLINE from function delcaration
Josh Innis [Thu, 10 Feb 2022 03:04:24 +0000 (19:04 -0800)] 
Bugfix - Remove INLINE from function delcaration

3 months agoRebase VLE code
John Gemignani [Sat, 5 Feb 2022 01:22:55 +0000 (17:22 -0800)] 
Rebase VLE code

Rebased the VLE code -

Pulled out the graphid list and stack data structures used by the
VLE so that they may be used by others. This also provides a good
place for other graph related data structures to be stored.

Pulled out the graph creation and management routines and the graph
vertex and edge data structures to allow for other uses beyond VLE.

The data structures for the graph were purposely not moved in with
the other data structures as they are vital to the graph creation
and management logic. It might be useful to eventually refactor this
to expand what a graph may contain. But, for now, it was left alone.

The header files: age_global_graph.h and age_graphid_ds.h have the
interfaces for these functions and are designed to hide the
implementation from the user.

All regression tests completed without issue.

3 months agoImplement Merge Clause
Josh Innis [Thu, 10 Feb 2022 01:37:45 +0000 (17:37 -0800)] 
Implement Merge Clause

MERGE either matches existing nodes and binds them, or
it creates new data and binds that. It’s like a
combination  of  MATCH  and  CREATE  that  additionally
allows  you  to  specify  what  happens  if  the  data
was matched or created.

For example, you can specify that the graph must contain
a node for a user with a certain name. If there isn’t a
node with the correct name, a new node will be created
and its name property set.

When  using  MERGE  on  full patterns, the behavior is
that either the whole pattern matches, or the whole
pattern is created. MERGE will not partially use existing
patterns—it’s all or nothing. If partial matches are
needed, this can be accomplished by splitting a pattern up
into multiple MERGE clauses.

As with MATCH, MERGE can match multiple occurrences of a
pattern. If there are multiple matches, they will all be
passed on to later stages of the query.

3 months agobug-fix: chained union logic
Dehowe Feng [Thu, 3 Feb 2022 00:42:39 +0000 (16:42 -0800)] 
bug-fix: chained union logic

fixed bug with chained unions that failed to remove duplicate values

the bug appeared when mixing agtypes and chaining multiple unions

3 months agoAllow a path of one vertex
John Gemignani [Tue, 25 Jan 2022 23:59:07 +0000 (15:59 -0800)] 
Allow a path of one vertex

Add in the logic to allow a path of one vertex. This will bring AGE
paths in line with others who use the openCypher specification,
namely, Neo4j.

Adjust regression tests.

3 months agoCreated functions for load graph from csv files (#155)
Shoaib [Wed, 26 Jan 2022 18:01:19 +0000 (19:01 +0100)] 
Created functions for load graph from csv files (#155)

3 months agohotfix: A C99 compliant declaration was used
John Gemignani [Wed, 26 Jan 2022 01:59:39 +0000 (17:59 -0800)] 
hotfix: A C99 compliant declaration was used

A C99 compliant declaration was used by mistake -

In function ‘transform_cypher_optional_match_clause’:
error: ‘for’ loop initial declarations are only allowed in C99 mode

for (int i = list_length(pstate->p_joinexprs) + 1; i < j->rtindex; i++)

This corrects that issue.

3 months agofeat: Implement `OPTIONAL MATCH` (#175)
Alex Kwak [Wed, 26 Jan 2022 01:46:44 +0000 (10:46 +0900)] 
feat: Implement `OPTIONAL MATCH` (#175)

* feat: Implement `OPTIONAL MATCH`

* Reflect review.

* Reflect review

* Reflect review

* Reflect review

* Reflect review

* Reflect Review

* Reflect review

* Reflect review

* Fix broken

3 months agoAdd UNION into EXPLAIN grammar rule
Dehowe Feng [Wed, 26 Jan 2022 01:36:05 +0000 (17:36 -0800)] 
Add UNION into EXPLAIN grammar rule

Small bug fix to include UNION into thr EXPLAIN grammar rule

Replaces single_query with query_list in EXPLAIN grammar rules

3 months agofeat: Implement `UNWIND` clause. (#173)
Alex Kwak [Wed, 26 Jan 2022 00:19:21 +0000 (09:19 +0900)] 
feat: Implement `UNWIND` clause. (#173)

* feat: Implement `UNWIND` clause.

* Block types on use `UNWIND` clause.

* Block types on use `UNWIND` clause.

* Block types on use `UNWIND` clause.

* Block types on use `UNWIND` clause.

* Reflect review

* Reflect review

Co-authored-by: Josh Innis <>
3 months agoImplement UNION clause
Dehowe Feng [Thu, 20 Jan 2022 23:31:37 +0000 (15:31 -0800)] 
Implement UNION clause

Adds UNION clause to AGE

Modifies grammar rules to accomodate UNION and future set functions

UNION returns all rows of two sets

UNION ALL appends the sets and returns all rows

3 months agofix: small error
0xflotus [Sat, 22 Jan 2022 13:52:45 +0000 (14:52 +0100)] 
fix: small error

4 months agoRemove old docs
Pieterjan De Potter [Thu, 23 Dec 2021 14:04:06 +0000 (15:04 +0100)] 
Remove old docs

4 months agofix: (nodejs) Corrects parsing for independence value (#177)
Alex Kwak [Fri, 21 Jan 2022 17:10:36 +0000 (02:10 +0900)] 
fix: (nodejs) Corrects parsing for independence value (#177)

4 months agoMerge branch 'master' of 174/head v.0.7.0-rc0 v0.7.0
Dehowe Feng [Fri, 14 Jan 2022 00:42:46 +0000 (16:42 -0800)] 
Merge branch 'master' of

4 months agoUpdate AGE from 0.6.0 to 0.7.0
Dehowe Feng [Fri, 14 Jan 2022 00:25:06 +0000 (16:25 -0800)] 
Update AGE from 0.6.0 to 0.7.0

Updated the Makefile, the README, the default version in age.control,
added released notes and updated the age--*.sql filename.

4 months agoUpdate from 0.6.0 to 0.7.0
Dehowe Feng [Fri, 14 Jan 2022 00:25:06 +0000 (16:25 -0800)] 
Update from 0.6.0 to 0.7.0

Updated the Makefile, the README, the default version in age.control,
added released notes and updated the age--*.sql filename.

4 months agoFix is_array_path to accept a single vertex.
John Gemignani [Tue, 11 Jan 2022 00:30:41 +0000 (16:30 -0800)] 
Fix is_array_path to accept a single vertex.

Fixed the is_array_path function to accept a single vertex.

4 months agoAdd fix for VLE zero boundary case in path
John Gemignani [Sat, 8 Jan 2022 00:07:20 +0000 (16:07 -0800)] 
Add fix for VLE zero boundary case in path

Added a fix for the VLE zero boundary case when paths are generated.

Added regression tests.

4 months agoAdding ASF License header to Python and Golang Drivers source files (#150)
Rhizome [Thu, 6 Jan 2022 21:49:23 +0000 (06:49 +0900)] 
Adding ASF License header to Python and Golang Drivers source files (#150)

* Delete .DS_Store
* Delete mapper.go
* fix caching vertex object
* prepare for variable path
* Add ASF License
* Change Agtype Parser antlr grammar

Co-authored-by: rhizome-ai <>
Co-authored-by: Halkrine <>
4 months agoAdd zero boundary case [*0..x] to VLE
John Gemignani [Tue, 4 Jan 2022 23:22:10 +0000 (15:22 -0800)] 
Add zero boundary case [*0..x] to VLE

Added the zero boundary case [*0..x] to the VLE.

Fixed some Travis CI warnings in the VLE code.

Added additional regression tests.

4 months agoCreate Dockerfile (#164)
joefagan [Tue, 4 Jan 2022 18:09:53 +0000 (18:09 +0000)] 
Create Dockerfile (#164)

* Create Dockerfile

* Add AGE to load automatically.

Add to skip the 'CREATE EXTENSION' and 'LOAD' commands.

Co-authored-by: Alex Kwak <>
4 months agoupdated documentation link (#170)
Shoaib [Thu, 30 Dec 2021 01:51:51 +0000 (02:51 +0100)] 
updated documentation link (#170)

updated broken logo path

4 months agoFix Travis CI build warning messages
John Gemignani [Wed, 29 Dec 2021 21:06:42 +0000 (13:06 -0800)] 
Fix Travis CI build warning messages

Fixed some of the Travic CI build warning messages.

Others are due to Assert being removed from compilation.

4 months agoExpose private function integer_to_agtype_value
John Gemignani [Tue, 28 Dec 2021 18:55:09 +0000 (10:55 -0800)] 
Expose private function integer_to_agtype_value

Expose the private function integer_to_agtype_value.

5 months agoFix typo in Github issue templates (#169)
Pieterjan De Potter [Thu, 23 Dec 2021 16:54:44 +0000 (17:54 +0100)] 
Fix typo in Github issue templates (#169)

5 months agoAdd test for handling incorrect variable in Set Clause (#160 #165) (#167)
Pieterjan De Potter [Wed, 22 Dec 2021 19:45:53 +0000 (20:45 +0100)] 
Add test for handling incorrect variable in Set Clause (#160 #165) (#167)

5 months agofeat: implement type casting, Agtype to int4[] (#107)
Alex Kwak [Wed, 22 Dec 2021 01:08:43 +0000 (10:08 +0900)] 
feat: implement type casting, Agtype to int4[] (#107)

* feat: implement type casting, Agtype to int4[]

* chore: reformat code.

* Clean up

5 months agoCorrects abnormal termination due to incorrect variable in Set Clause. (#165)
Alex Kwak [Wed, 22 Dec 2021 00:09:48 +0000 (09:09 +0900)] 
Corrects abnormal termination due to incorrect variable in Set Clause. (#165)

Previously, `ColumnRef` may come according to the Parser rule. but, this case is not considered.
Therefore, add logic to detect these errors.

5 months agoAdd to age_round function so that it accepts 2 parameters and returned a rounded...
Quoc Viet Vuong [Wed, 22 Dec 2021 00:06:47 +0000 (07:06 +0700)] 
Add to age_round function so that it accepts 2 parameters and returned a rounded number with precision passed as 2nd parameter (#159)

5 months agoAdd AGTYPE and GRAPHID send and receive functions
John Gemignani [Tue, 21 Dec 2021 22:48:03 +0000 (14:48 -0800)] 
Add AGTYPE and GRAPHID send and receive functions

Added the send and receive functions for both AGTYPE and GRAPHID.

5 months agoRefactor VLE edge uniqueness check
John Gemignani [Thu, 16 Dec 2021 01:18:05 +0000 (17:18 -0800)] 
Refactor VLE edge uniqueness check

Refactored the VLE edge uniqueness check to make it more efficient
for larger paths.

This change replaces _ag_enforce_edge_uniqueness with a hash table
implementation. This will impact all callers to this function.

Added the option to pass in INT8 and GRAPHID.

Removed unnecessary supporting code.

5 months agoFix Licensing Issues in Master (#157)
Josh Innis [Fri, 10 Dec 2021 22:44:51 +0000 (14:44 -0800)] 
Fix Licensing Issues in Master (#157)

Changed License for some files to Postgres License
Fixed Copyright information in NOTICE
Alter Disclaimer

Co-authored-by: Eya Badal <>
5 months agoIntegrate the VLE core into the MATCH clause
John Gemignani [Fri, 22 Oct 2021 21:51:38 +0000 (14:51 -0700)] 
Integrate the VLE core into the MATCH clause

This patch integrates the VLE core (age_vle) into the MATCH clause.

All ranges are suppored (except for an initial 0, it is treated as
a 1 currently) -

    MATCH (u)-[*]->(v) RETURN u,v;
    MATCH ()-[e*]->() RETURN e;
    MATCH ()-[e*1]->() RETURN e;
    MATCH ()-[e*..]->() RETURN e;
    MATCH ()-[e*1..]->() RETURN e;
    MATCH ()-[e*..2]->() RETURN e;
    MATCH ()-[e*1..2]->() RETURN e;

All directions are supported -

    MATCH ()-[e*]->() RETURN e;
    MATCH ()<-[e*]-() RETURN e;
    MATCH ()-[e*]-() RETURN e;

Labels are supported -


Properties are supported -

    MATCH (c1:CITY)-[* {name: "Main St."}]-(c2:CITY) RETURN c1, c2;

Singular VLE expressions are supported -

    MATCH ()-[e*]->() RETURN e;

The path variable is supported -

    MATCH p=()-[*]-() RETURN p;

Chained VLE expressions are supported -

   BUG: MATCH ()-[e1*]->()-[e2*]->() RETURN e1,e2; (crash)

Mixed VLE expressions are supported -

   BUG: MATCH ()-[e1]->(v)-[e2*]->() RETURN e1,e2;

Split VLE expressions are NOT supported yet -

     MATCH (u)-[e1*]->(v) MATCH (v)-[e2*]->(w) RETURN e1;

Added regression tests.

NOTE: A VLE edge variable will return a list of edges.

5 months agoFix wrong parse tree when use EXISTS PATTERN (#141)
Alex Kwak [Tue, 30 Nov 2021 22:36:09 +0000 (07:36 +0900)] 
Fix wrong parse tree when use EXISTS PATTERN (#141)

EXISTS PATTERN used ParseState as it was and affected the upper query.
Use a temporary ParseState to solve this problem.

5 months agoAdding AGType parsers and driver supports for Python & Go (#87)
Rhizome [Tue, 30 Nov 2021 22:16:52 +0000 (07:16 +0900)] 
Adding AGType parsers and driver supports for Python & Go   (#87)

Co-authored-by: rhizome-ai <>
Co-authored-by: Halkrine <>
5 months agoUpdated code for create vertex and edge labels (#136)
Shoaib [Tue, 30 Nov 2021 20:36:44 +0000 (21:36 +0100)] 
Updated code for create vertex and edge labels (#136)

Code now inherits tables from ag_vertex and ag_edges that was a bug in
previous release.

5 months agoAdd to age_reverse function so that it can reverse an agtype list (#146)
Quoc Viet Vuong [Tue, 30 Nov 2021 20:27:30 +0000 (03:27 +0700)] 
Add to age_reverse function so that it can reverse an agtype list (#146)

5 months agofix: (driver/nodejs) fix problems that occur when an object is empty or nested. ...
Alex Kwak [Tue, 30 Nov 2021 20:21:59 +0000 (05:21 +0900)] 
fix: (driver/nodejs) fix problems that occur when an object is empty or nested. (#104)

5 months agochore: create issue templates (#90)
Alex Kwak [Tue, 30 Nov 2021 20:18:57 +0000 (05:18 +0900)] 
chore: create issue templates (#90)

* chore: create issue templates
* chore: applied suggestion to

6 months ago fix to allow compilation on mac os x (#82)
Dmitriy Dorofeev [Mon, 8 Nov 2021 16:53:12 +0000 (19:53 +0300)] 
 fix to allow compilation on mac os x (#82)

6 months agoFix documentation link in readme (fixes #133) (#134)
Pieterjan De Potter [Thu, 28 Oct 2021 19:59:16 +0000 (21:59 +0200)] 
Fix documentation link in readme (fixes #133) (#134)

7 months agoImplement XOR Operator
Dehowe Feng [Sat, 23 Oct 2021 00:40:19 +0000 (17:40 -0700)] 
Implement XOR Operator

Implemented XOR in the grammar using logical and, or and not.

This is ticket AGE2-478

Added regression tests.

7 months agoAdd openCypher nodes() function AGE2-421
Dehowe Feng [Tue, 12 Oct 2021 20:32:22 +0000 (13:32 -0700)] 
Add openCypher nodes() function AGE2-421

Add the openCypher nodes() function.

Added regression tests.

Reorganized the keys implementation to be where the
rest of the list functions were.

7 months agoAdd openCypher labels() function AGE2-420
John Gemignani [Thu, 7 Oct 2021 00:53:09 +0000 (17:53 -0700)] 
Add openCypher labels() function AGE2-420

Added the openCypher labels() function. This is Jira ticket AGE2-420.

Added regression tests.

7 months agoUpdate (#128)
Andy Koh [Fri, 8 Oct 2021 20:20:09 +0000 (05:20 +0900)] 
Update (#128)

7 months agoAdd openCypher keys() function AGE2-419
Dehowe Feng [Wed, 6 Oct 2021 23:58:13 +0000 (16:58 -0700)] 
Add openCypher keys() function AGE2-419

Added  the keys() function. This is ticket AGE2-419.

Added regression tests.

7 months agoAdd openCypher range() function AGE2-422
John Gemignani [Wed, 6 Oct 2021 00:31:40 +0000 (17:31 -0700)] 
Add openCypher range() function AGE2-422

Added the openCypher range() function. This is Jira ticket

Added regression tests.


This range() function differs slightly from some other
implementations in that it will return an empty list for start,
end, and step combinations that wouldn't result in anything being
generated. Some other implementations will generate errors instead.

For example: range(0, -10, 1) or range(0, -10) will return [].

7 months agoAdd openCypher relationships() function AGE2-423
John Gemignani [Tue, 5 Oct 2021 00:21:17 +0000 (17:21 -0700)] 
Add openCypher relationships() function AGE2-423

Added the openCypher relationships() function. This is Jira ticket

Added regression tests.

7 months agoAdd regular expression comparisons `=~` with expressions
John Gemignani [Fri, 1 Oct 2021 20:45:31 +0000 (13:45 -0700)] 
Add regular expression comparisons `=~` with expressions

Added the `=~` operator for regular expression comparisons with
expressions. This was from Jira ticket AGE2-435.

Added regression tests.

7 months agoFor primitive types like int, abandon using add_agtype. Instead push the value direct...
Quoc Viet Vuong [Fri, 1 Oct 2021 20:16:25 +0000 (03:16 +0700)] 
For primitive types like int, abandon using add_agtype. Instead push the value directly. (#124)

7 months agoPatch SET's usage of currentCommandId during locking
John Gemignani [Sat, 25 Sep 2021 00:15:25 +0000 (17:15 -0700)] 
Patch SET's usage of currentCommandId during locking

This patch fixes the incorrect flagging of an update in SET in the lock

7 months agoLabels creation functions (#115)
Shoaib [Tue, 28 Sep 2021 19:25:50 +0000 (21:25 +0200)] 
Labels creation functions (#115)

Two more functions create_vlabel and create_elabel have been added.

User can call these functions to create blank labels.

Usage as following:

SELECT create_vlabel('cypher', 'vlabel_1');
SELECT create_elabel('cypher', 'elabel_1');

modified makefile to support UTF.

Added regression tests and comments

Make badges on the README page dynamic (#116)

This way, the release badge doesn't need to be updated each release

Co-authored-by: Pieterjan De Potter <>
8 months agoDELETE refactor and bug fix
John Gemignani [Tue, 21 Sep 2021 16:24:21 +0000 (09:24 -0700)] 
DELETE refactor and bug fix

This patch utilizes some of the ideas from the partial CREATE
refactor for the transaction bugs (AGE2-337 and AGE2-345) to bring
DELETE up to date.

Added additional regression tests

8 months agoSET refactor and feature upgrade
John Gemignani [Fri, 17 Sep 2021 19:59:06 +0000 (12:59 -0700)] 
SET refactor and feature upgrade

This patch utilizes some of the ideas from the partial CREATE
refactor for the transaction bugs (AGE2-337 and AGE2-345) to bring
SET (and REMOVE) up to date.

Additionally, this refactor enabled allowing multiple items to now
be set all at once.

Added regression tests for both SET and REMOVE.

8 months agoMake badges on the README page dynamic (#116)
Pieterjan De Potter [Wed, 15 Sep 2021 15:57:40 +0000 (17:57 +0200)] 
Make badges on the README page dynamic (#116)

This way, the release badge doesn't need to be updated each release

8 months agoUpdate version from 0.5.0 to 0.6.0
Josh Innis [Thu, 9 Sep 2021 22:44:17 +0000 (15:44 -0700)] 
Update version from 0.5.0 to 0.6.0

Updated the age--*.sql filename, the default version
in age.control, added release notes and modified the
README and in the docs.

8 months agofix: (drivers) add ASF license on drivers. (#114)
Alex Kwak [Thu, 9 Sep 2021 19:02:29 +0000 (04:02 +0900)] 
fix: (drivers) add ASF license on drivers. (#114)

Awesome, thanks for the help

8 months agoFix compiler messages on Travis CI
John Gemignani [Thu, 9 Sep 2021 16:49:31 +0000 (09:49 -0700)] 
Fix compiler messages on Travis CI

8 months agoUpdate package.json
Josh Innis [Wed, 8 Sep 2021 15:45:17 +0000 (08:45 -0700)] 
Update package.json

Added License

8 months agoUpdate tsconfig.json
Josh Innis [Wed, 8 Sep 2021 15:44:54 +0000 (08:44 -0700)] 
Update tsconfig.json

Added License

8 months agoUpdate jest.config.js
Josh Innis [Wed, 8 Sep 2021 15:36:55 +0000 (08:36 -0700)] 
Update jest.config.js

Added License

8 months agoMerge branch 'master' of
John Gemignani [Tue, 7 Sep 2021 21:20:46 +0000 (14:20 -0700)] 
Merge branch 'master' of

8 months agoAdd ASF license
John Gemignani [Tue, 7 Sep 2021 21:20:22 +0000 (14:20 -0700)] 
Add ASF license

8 months agoUpdate .asf.yaml
Eya Badal [Tue, 7 Sep 2021 20:21:23 +0000 (13:21 -0700)] 
Update .asf.yaml

8 months agodocs (#96)
Dan Caron [Sat, 4 Sep 2021 00:05:22 +0000 (20:05 -0400)] 
docs (#96)

8 months agoAdd VLE SRF (Set Returning Function) age_vle
John Gemignani [Tue, 25 May 2021 16:43:31 +0000 (09:43 -0700)] 
Add VLE SRF (Set Returning Function) age_vle

This patch contains the age_vle SRF and all of its supporting code.

The age_vle function takes the following input arguments -

    0 - agtype (graph name as an agtype string)
    1 - agtype (start vertex as an agtype vertex)
    2 - agtype (end vertex as an agtype vertex)
    3 - agtype (edge prototype to match as an agtype edge)
                Note: Only the label and properties are used. The
                      rest is ignored.
    4 - agtype lidx (lower range index)
                Note: 0 is not supported but is equivalent to 1.
    5 - agtype uidx (upper range index)
                Note: An AGTV_NULL is appropriate here for an
                      infinite upper bound.
    6 - agtype edge direction (enum) as an integer -

            CYPHER_REL_DIR_NONE = 0,
            CYPHER_REL_DIR_LEFT = -1,
            CYPHER_REL_DIR_RIGHT = 1

    NOTE: The above values for the enum are TEMPORARY and are only
          for testing. They will be removed after VLE integration
          has completed. Using these values directly in any code
          is not recommended.

Included are regression tests for paths and edge matching.
All components should be fully functional.


8 months agoupdate overview in readme (#111)
Quoc Viet Vuong [Tue, 31 Aug 2021 23:56:17 +0000 (06:56 +0700)] 
update overview in readme (#111)

* update with more exact descriptions

* Update

9 months agoFix bug in openCypher CREATE AGE2-345
John Gemignani [Wed, 18 Aug 2021 23:55:59 +0000 (16:55 -0700)] 
Fix bug in openCypher CREATE AGE2-345

This fixes a bug in the openCypher execution logic for the CREATE
command. See Jira ticket AGE2-337 and Github issue #88 for more

This bug causes block transactions to not see the previous creates.
This is due to the currentCommandId not actually being incremented.
This patch corrects that by using the following functions to
manipulate it -

     GetCurrentCommandId(true); and

There is a bit of a rewrite of the function exec_cypher_create in
order to accomodate this change.

While working on this I noticed that we probably should revisit the
logic for the openCypher commands set and delete as they also use
the previous method for incrementing the currentCommandId. But, these
look to be too involved for adding it here.

Added regression tests.


9 months agoFix bug in openCypher CREATE AGE2-337
John Gemignani [Sat, 14 Aug 2021 00:37:23 +0000 (17:37 -0700)] 
Fix bug in openCypher CREATE AGE2-337

This fixes a bug in the openCypher execution logic for the CREATE
command. See Jira ticket AGE2-337 for more details.

This bug became obvious when using the openCypher CREATE command
as part of an INSERT INTO command. There may be other similar
commands that were affected that this ticket might resolve. This
is due to how the information being passed from the openCypher
SELECT command is passed back into other commands.

This fix involves saving and restoring the result relation info for
the current target node state. This is done in both the create_vertex
and create_edge functions.

The previous logic just overwrote the value. However, when tuples
were passed back, say to INSERT, this modified value did not align
with what the value actually was. This caused crashes as the data
had the wrong descriptor. It may have also cause silent bugs.

Added regression tests for INSERT INTO (...)

9 months agochore: (driver/jdbc) update copyright header (#99)
Alex Kwak [Tue, 3 Aug 2021 21:51:01 +0000 (06:51 +0900)] 
chore: (driver/jdbc) update copyright header (#99)

* chore: (driver/jdbc) update copyright header

* chore: (driver/jdbc) remove gradle-wrapper.jar