/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ LOAD 'age'; SET search_path TO ag_catalog; SELECT create_graph('cypher_match'); NOTICE: graph "cypher_match" has been created create_graph -------------- (1 row) SELECT * FROM cypher('cypher_match', $$CREATE (:v)$$) AS (a agtype); a --- (0 rows) SELECT * FROM cypher('cypher_match', $$CREATE (:v {i: 0})$$) AS (a agtype); a --- (0 rows) SELECT * FROM cypher('cypher_match', $$CREATE (:v {i: 1})$$) AS (a agtype); a --- (0 rows) SELECT * FROM cypher('cypher_match', $$MATCH (n:v) RETURN n$$) AS (n agtype); n ----------------------------------------------------------------------- {"id": 844424930131969, "label": "v", "properties": {}}::vertex {"id": 844424930131970, "label": "v", "properties": {"i": 0}}::vertex {"id": 844424930131971, "label": "v", "properties": {"i": 1}}::vertex (3 rows) SELECT * FROM cypher('cypher_match', $$MATCH (n:v) RETURN n.i$$) AS (i agtype); i --- 0 1 (3 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (n:v) WHERE n.i > 0 RETURN n.i $$) AS (i agtype); i --- 1 (1 row) --Directed Paths SELECT * FROM cypher('cypher_match', $$ CREATE (:v1 {id:'initial'})-[:e1]->(:v1 {id:'middle'})-[:e1]->(:v1 {id:'end'}) $$) AS (a agtype); a --- (0 rows) --Undirected Path Tests SELECT * FROM cypher('cypher_match', $$ MATCH p=(:v1)-[:e1]-(:v1)-[:e1]-(:v1) RETURN p $$) AS (a agtype); a --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex, {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge, {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex, {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge, {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex]::path [{"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex, {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge, {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex, {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge, {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex]::path (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH p=(a:v1)-[]-()-[]-() RETURN a $$) AS (a agtype); a ---------------------------------------------------------------------------------- {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[]-()-[]-(a:v1) RETURN a $$) AS (a agtype); a ---------------------------------------------------------------------------------- {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[]-(a:v1)-[]-() RETURN a $$) AS (a agtype); a --------------------------------------------------------------------------------- {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[b:e1]-()-[]-() RETURN b $$) AS (a agtype); a --------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (a:v1)-[]->(), ()-[]->(a) RETURN a $$) AS (a agtype); a --------------------------------------------------------------------------------- {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH p=()-[e]-() RETURN e $$) AS (a agtype); a --------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge (4 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (:v1)-[e]-() RETURN e $$) AS (a agtype); a --------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge (4 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (:v1)-[e]-(:v1) RETURN e $$) AS (a agtype); a --------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge (4 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[]-()-[e]-(:v1) RETURN e $$) AS (a agtype); a --------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (a)-[]-()-[]-(:v1) RETURN a $$) AS (a agtype); a ---------------------------------------------------------------------------------- {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex (2 rows) -- Right Path Test SELECT * FROM cypher('cypher_match', $$ MATCH (a:v1)-[:e1]->(b:v1)-[:e1]->(c:v1) RETURN a, b, c $$) AS (a agtype, b agtype, c agtype); a | b | c ----------------------------------------------------------------------------------+---------------------------------------------------------------------------------+------------------------------------------------------------------------------ {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex | {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex | {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH p=(a:v1)-[]-()-[]->() RETURN a $$) AS (a agtype); a ---------------------------------------------------------------------------------- {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH p=(a:v1)-[]->()-[]-() RETURN a $$) AS (a agtype); a ---------------------------------------------------------------------------------- {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[]-()-[]->(a:v1) RETURN a $$) AS (a agtype); a ------------------------------------------------------------------------------ {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[]-(a:v1)-[]->() RETURN a $$) AS (a agtype); a --------------------------------------------------------------------------------- {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[b:e1]-()-[]->() RETURN b $$) AS (a agtype); a --------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH (:v1)-[e]->() RETURN e $$) AS (a agtype); a --------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[e]->(:v1) RETURN e $$) AS (a agtype); a --------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (:v1)-[e]->(:v1) RETURN e $$) AS (a agtype); a --------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge (2 rows) --Left Path Test SELECT * FROM cypher('cypher_match', $$ MATCH (a:v1)<-[:e1]-(b:v1)<-[:e1]-(c:v1) RETURN a, b, c $$) AS (a agtype, b agtype, c agtype); a | b | c ------------------------------------------------------------------------------+---------------------------------------------------------------------------------+---------------------------------------------------------------------------------- {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex | {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex | {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH p=(a:v1)<-[]-()-[]-() RETURN a $$) AS (a agtype); a ------------------------------------------------------------------------------ {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH p=(a:v1)-[]-()<-[]-() RETURN a $$) AS (a agtype); a ------------------------------------------------------------------------------ {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH ()<-[]-()-[]-(a:v1) RETURN a $$) AS (a agtype); a ---------------------------------------------------------------------------------- {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH ()<-[]-(a:v1)-[]-() RETURN a $$) AS (a agtype); a --------------------------------------------------------------------------------- {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH ()<-[b:e1]-()-[]-() RETURN b $$) AS (a agtype); a --------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH (:v1)<-[e]-(:v1) RETURN e $$) AS (a agtype); a --------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge (2 rows) --Divergent Path Tests SELECT * FROM cypher('cypher_match', $$ CREATE (:v2 {id:'initial'})<-[:e2]-(:v2 {id:'middle'})-[:e2]->(:v2 {id:'end'}) $$) AS (a agtype); a --- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()<-[]-(n:v2)-[]->() MATCH p=()-[]->(n) RETURN p $$) AS (i agtype); i --- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()<-[]-(n:v2)-[]->() MATCH p=(n)-[]->() RETURN p $$) AS (i agtype); i ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex]::path [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex]::path [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex]::path [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex]::path (4 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[]-(n:v2) RETURN n $$) AS (i agtype); i ---------------------------------------------------------------------------------- {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex (4 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (:v2)<-[]-(:v2)-[]->(:v2) MATCH p=()-[]->() RETURN p $$) AS (i agtype); i ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ [{"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex, {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge, {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex]::path [{"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex, {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge, {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex]::path [{"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex, {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge, {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex]::path [{"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex, {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge, {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex]::path [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex]::path [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex]::path [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex]::path [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex]::path (8 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()<-[]-(:v2)-[]->() MATCH p=()-[]->() RETURN p $$) AS (i agtype); i ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ [{"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex, {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge, {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex]::path [{"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex, {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge, {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex]::path [{"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex, {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge, {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex]::path [{"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex, {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge, {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex]::path [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex]::path [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex]::path [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex]::path [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex]::path (8 rows) --Convergent Path Tests SELECT * FROM cypher('cypher_match', $$ CREATE (:v3 {id:'initial'})-[:e3]->(:v3 {id:'middle'})<-[:e3]-(:v3 {id:'end'}) $$) AS (a agtype); a --- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[b:e1]->() RETURN b $$) AS (i agtype); i --------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (:v3)-[b:e3]->() RETURN b $$) AS (i agtype); i --------------------------------------------------------------------------------------------------------------------------- {"id": 2533274790395905, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685251, "properties": {}}::edge {"id": 2533274790395906, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685249, "properties": {}}::edge (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[]->(n:v1)<-[]-() MATCH p=(n)<-[]-() RETURN p $$) AS (i agtype); i --- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[]->(n:v1)<-[]-() MATCH p=()-[]->(n) RETURN p $$) AS (i agtype); i --- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[]->(n:v1)<-[]-() MATCH p=(n)-[]->() RETURN p $$) AS (i agtype); i --- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH con_path=(a)-[]->()<-[]-() where a.id = 'initial' RETURN con_path $$) AS (con_path agtype); con_path --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 2251799813685249, "label": "v3", "properties": {"id": "initial"}}::vertex, {"id": 2533274790395906, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685249, "properties": {}}::edge, {"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex, {"id": 2533274790395905, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685251, "properties": {}}::edge, {"id": 2251799813685251, "label": "v3", "properties": {"id": "end"}}::vertex]::path (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH div_path=(b)<-[]-()-[]->() where b.id = 'initial' RETURN div_path $$) AS (div_path agtype); div_path --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex, {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex]::path (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH (a)-[]->(:v3)<-[]-(b) where a.id = 'initial' RETURN b $$) AS (con_path agtype); con_path ------------------------------------------------------------------------------ {"id": 2251799813685251, "label": "v3", "properties": {"id": "end"}}::vertex (1 row) --Patterns SELECT * FROM cypher('cypher_match', $$ MATCH (a:v1), p=(a)-[]-()-[]-() where a.id = 'initial' RETURN p $$) AS (p agtype); p --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex, {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge, {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex, {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge, {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex]::path (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH con_path=(a)-[]->()<-[]-(), div_path=(b)<-[]-()-[]->() where a.id = 'initial' and b.id = 'initial' RETURN con_path, div_path $$) AS (con_path agtype, div_path agtype); con_path | div_path ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 2251799813685249, "label": "v3", "properties": {"id": "initial"}}::vertex, {"id": 2533274790395906, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685249, "properties": {}}::edge, {"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex, {"id": 2533274790395905, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685251, "properties": {}}::edge, {"id": 2251799813685251, "label": "v3", "properties": {"id": "end"}}::vertex]::path | [{"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex, {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex]::path (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH (a:v), p=()-[]->()-[]->() RETURN a.i, p $$) AS (i agtype, p agtype); i | p ---+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | [{"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex, {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge, {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex, {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge, {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex]::path 0 | [{"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex, {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge, {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex, {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge, {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex]::path 1 | [{"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex, {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge, {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex, {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge, {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex]::path (3 rows) --Multiple Match Clauses SELECT * FROM cypher('cypher_match', $$ MATCH (a:v1) where a.id = 'initial' MATCH p=(a)-[]-()-[]-() RETURN p $$) AS (p agtype); p --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex, {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge, {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex, {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge, {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex]::path (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH (a:v) MATCH p=()-[]->()-[]->() RETURN a.i, p $$) AS (i agtype, p agtype); i | p ---+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | [{"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex, {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge, {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex, {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge, {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex]::path 0 | [{"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex, {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge, {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex, {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge, {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex]::path 1 | [{"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex, {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge, {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex, {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge, {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex]::path (3 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (a:v) MATCH (b:v1)-[]-(c) RETURN a.i, b.id, c.id $$) AS (i agtype, b agtype, c agtype); i | b | c ---+-----------+----------- | "end" | "middle" 0 | "end" | "middle" 1 | "end" | "middle" | "middle" | "end" 0 | "middle" | "end" 1 | "middle" | "end" | "middle" | "initial" 0 | "middle" | "initial" 1 | "middle" | "initial" | "initial" | "middle" 0 | "initial" | "middle" 1 | "initial" | "middle" (12 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (a:v) MATCH (:v1)-[]-(c) RETURN a.i, c.id $$) AS (i agtype, c agtype); i | c ---+----------- | "initial" 0 | "initial" 1 | "initial" | "middle" 0 | "middle" 1 | "middle" | "middle" 0 | "middle" 1 | "middle" | "end" 0 | "end" 1 | "end" (12 rows) -- -- Property constraints -- SELECT * FROM cypher('cypher_match', $$CREATE ({string_key: "test", int_key: 1, float_key: 3.14, map_key: {key: "value"}, list_key: [1, 2, 3]}) $$) AS (p agtype); p --- (0 rows) SELECT * FROM cypher('cypher_match', $$CREATE ({lst: [1, NULL, 3.14, "string", {key: "value"}, []]}) $$) AS (p agtype); p --- (0 rows) SELECT * FROM cypher('cypher_match', $$MATCH (n {string_key: NULL}) RETURN n $$) AS (n agtype); n --- (0 rows) SELECT * FROM cypher('cypher_match', $$MATCH (n {string_key: "wrong value"}) RETURN n $$) AS (n agtype); n --- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (n {string_key: "test", int_key: 1, float_key: 3.14, map_key: {key: "value"}, list_key: [1, 2, 3]}) RETURN n $$) AS (p agtype); p ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"int_key": 1, "map_key": {"key": "value"}, "list_key": [1, 2, 3], "float_key": 3.14, "string_key": "test"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$MATCH (n {string_key: "test"}) RETURN n $$) AS (p agtype); p ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"int_key": 1, "map_key": {"key": "value"}, "list_key": [1, 2, 3], "float_key": 3.14, "string_key": "test"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$MATCH (n {lst: [1, NULL, 3.14, "string", {key: "value"}, []]}) RETURN n $$) AS (p agtype); p ---------------------------------------------------------------------------------------------------------------------- {"id": 281474976710658, "label": "", "properties": {"lst": [1, null, 3.14, "string", {"key": "value"}, []]}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$MATCH (n {lst: [1, NULL, 3.14, "string", {key: "value"}, [], "extra value"]}) RETURN n $$) AS (p agtype); p --- (0 rows) -- -- Prepared Statement Property Constraint -- PREPARE property_ps(agtype) AS SELECT * FROM cypher('cypher_match', $$MATCH (n $props) RETURN n $$, $1) AS (p agtype); EXECUTE property_ps(agtype_build_map('props', agtype_build_map('string_key', 'test'))); p ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"int_key": 1, "map_key": {"key": "value"}, "list_key": [1, 2, 3], "float_key": 3.14, "string_key": "test"}}::vertex (1 row) -- need a following RETURN clause (should fail) SELECT * FROM cypher('cypher_match', $$MATCH (n:v)$$) AS (a agtype); ERROR: syntax error at end of input LINE 1: SELECT * FROM cypher('cypher_match', $$MATCH (n:v)$$) AS (a ... ^ --invalid variable reuse, these should fail SELECT * FROM cypher('cypher_match', $$ MATCH (a)-[]-()-[]-(a:v1) RETURN a $$) AS (a agtype); ERROR: multiple labels for variable 'a' are not supported LINE 2: MATCH (a)-[]-()-[]-(a:v1) RETURN a ^ SELECT * FROM cypher('cypher_match', $$ MATCH (a)-[]-(a:v2)-[]-(a) RETURN a $$) AS (a agtype); ERROR: multiple labels for variable 'a' are not supported LINE 2: MATCH (a)-[]-(a:v2)-[]-(a) RETURN a ^ SELECT * FROM cypher('cypher_match', $$ MATCH (a)-[]-(a:v1) RETURN a $$) AS (a agtype); ERROR: multiple labels for variable 'a' are not supported LINE 2: MATCH (a)-[]-(a:v1) RETURN a ^ SELECT * FROM cypher('cypher_match', $$ MATCH (a)-[]-(a)-[]-(a:v1) RETURN a $$) AS (a agtype); ERROR: multiple labels for variable 'a' are not supported LINE 2: MATCH (a)-[]-(a)-[]-(a:v1) RETURN a ^ SELECT * FROM cypher('cypher_match', $$ MATCH (a)-[]-(a)-[]-(a:invalid_label) RETURN a $$) AS (a agtype); ERROR: multiple labels for variable 'a' are not supported LINE 2: MATCH (a)-[]-(a)-[]-(a:invalid_label) RETURN a ^ SELECT * FROM cypher('cypher_match', $$ MATCH (a) MATCH (a:v1) RETURN a $$) AS (a agtype); ERROR: multiple labels for variable 'a' are not supported LINE 2: MATCH (a) MATCH (a:v1) RETURN a ^ SELECT * FROM cypher('cypher_match', $$ MATCH (a) MATCH (a:invalid_label) RETURN a $$) AS (a agtype); ERROR: multiple labels for variable 'a' are not supported LINE 2: MATCH (a) MATCH (a:invalid_label) RETURN a ^ SELECT * FROM cypher('cypher_match', $$ MATCH (a:v1)-[]-()-[a]-() RETURN a $$) AS (a agtype); ERROR: variable 'a' is for a vertex LINE 2: MATCH (a:v1)-[]-()-[a]-() RETURN a ^ -- valid variable reuse for edge labels across clauses SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r0]->() MATCH ()-[r0]->() RETURN r0 $$) AS (r0 agtype); r0 --------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge {"id": 2533274790395905, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685251, "properties": {}}::edge {"id": 2533274790395906, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685249, "properties": {}}::edge (6 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r0:e1]->() MATCH ()-[r0:e1]->() RETURN r0 $$) AS (r0 agtype); r0 --------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r0:e2]->() MATCH ()-[r0:e2]->() RETURN r0 $$) AS (r0 agtype); r0 --------------------------------------------------------------------------------------------------------------------------- {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r0:e1]->()-[r1]->() RETURN r0,r1 $$) AS (r0 agtype, r1 agtype); r0 | r1 ---------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge | {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH p0=()-[:e1]->() MATCH p1=()-[:e2]->() RETURN p1 $$) AS (p1 agtype); p1 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex]::path [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex]::path [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex]::path [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex, {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge, {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex]::path (4 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r0:e1]->()-[r1]->() MATCH ()-[r0:e1]->()-[r1]->() RETURN r0,r1 $$) AS (r0 agtype, r1 agtype); r0 | r1 ---------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge | {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[]->() MATCH ()-[r1:e2]->() RETURN r1 $$) AS (r1 agtype); r1 --------------------------------------------------------------------------------------------------------------------------- {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge (12 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r0:e1]->() MATCH ()-[r1:e2]->() RETURN r0,r1 $$) AS (r0 agtype, r1 agtype); r0 | r1 ---------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge | {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge | {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge | {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge | {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge (4 rows) -- valid variable reuse for vertex labels across clauses SELECT * FROM cypher('cypher_match', $$ MATCH (r1:invalid), (r1:invalid) return r1 $$) AS (r1 agtype); r1 ---- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (r1), (r1) return r1 $$) AS (r1 agtype); r1 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"int_key": 1, "map_key": {"key": "value"}, "list_key": [1, 2, 3], "float_key": 3.14, "string_key": "test"}}::vertex {"id": 281474976710658, "label": "", "properties": {"lst": [1, null, 3.14, "string", {"key": "value"}, []]}}::vertex {"id": 844424930131969, "label": "v", "properties": {}}::vertex {"id": 844424930131970, "label": "v", "properties": {"i": 0}}::vertex {"id": 844424930131971, "label": "v", "properties": {"i": 1}}::vertex {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex {"id": 2251799813685249, "label": "v3", "properties": {"id": "initial"}}::vertex {"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex {"id": 2251799813685251, "label": "v3", "properties": {"id": "end"}}::vertex (14 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (r1:invalid), (r1) return r1 $$) AS (r1 agtype); r1 ---- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (r1:invalid), (r1), (r1), (r1:invalid) return r1 $$) AS (r1 agtype); r1 ---- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (r1:invalid)-[]->(r1)-[]->(r1:invalid)-[]->(r1) return r1 $$) AS (r1 agtype); r1 ---- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (r1:invalid)-[]->()-[]->()-[]->(r1:invalid) return r1 $$) AS (r1 agtype); r1 ---- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r0:e1]->()-[r1]->() MATCH ()-[r0:e1]->()-[r0]->() RETURN r0 $$) AS (r0 agtype); r0 ---- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r0:e1]->() MATCH ()-[r0]->() RETURN r0 $$) AS (r0 agtype); r0 --------------------------------------------------------------------------------------------------------------------------- {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge (2 rows) -- invalid variable reuse for vertex SELECT * FROM cypher('cypher_match', $$ MATCH (r1:invalid)-[]->(r1)-[]->(r1)-[]->(r1:invalids) return r1 $$) AS (r1 agtype); ERROR: multiple labels for variable 'r1' are not supported LINE 2: ... MATCH (r1:invalid)-[]->(r1)-[]->(r1)-[]->(r1:invalid... ^ SELECT * FROM cypher('cypher_match', $$ MATCH (r1:invalid)-[]->(r1)-[]->(r1)-[]->(r1)-[r1]->() return r1 $$) AS (r1 agtype); ERROR: variable 'r1' is for a vertex LINE 2: ... MATCH (r1:invalid)-[]->(r1)-[]->(r1)-[]->(r1)-[r1]->() r... ^ -- invalid variable reuse for labels across clauses SELECT * FROM cypher('cypher_match', $$ MATCH (r1:e1), (r1:e2) return r1 $$) AS (r1 agtype); ERROR: multiple labels for variable 'r1' are not supported LINE 2: MATCH (r1:e1), (r1:e2) return r1 ^ SELECT * FROM cypher('cypher_match', $$ MATCH (r1:invalid), (r1:e2) return r1 $$) AS (r1 agtype); ERROR: multiple labels for variable 'r1' are not supported LINE 2: MATCH (r1:invalid), (r1:e2) return r1 ^ SELECT * FROM cypher('cypher_match', $$ MATCH (r1:e1), (r1:invalid) return r1 $$) AS (r1 agtype); ERROR: multiple labels for variable 'r1' are not supported LINE 2: MATCH (r1:e1), (r1:invalid) return r1 ^ SELECT * FROM cypher('cypher_match', $$ MATCH (r1:e1), (r1), (r1:invalid) return r1 $$) AS (r1 agtype); ERROR: multiple labels for variable 'r1' are not supported LINE 2: MATCH (r1:e1), (r1), (r1:invalid) return r1 ^ SELECT * FROM cypher('cypher_match', $$ MATCH (r0)-[r0]->() MATCH ()-[]->() RETURN r0 $$) AS (r0 agtype); ERROR: variable 'r0' is for a vertex LINE 2: MATCH (r0)-[r0]->() MATCH ()-[]->() RETURN r0 ^ SELECT * FROM cypher('cypher_match', $$ MATCH (r0)-[]->() MATCH ()-[r0]->() RETURN r0 $$) AS (r0 agtype); ERROR: variable 'r0' is for a vertex LINE 2: MATCH (r0)-[]->() MATCH ()-[r0]->() RETURN r0 ^ SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r0]->() MATCH ()-[]->(r0) RETURN r0 $$) AS (r0 agtype); ERROR: variable 'r0' is for an edge LINE 2: MATCH ()-[r0]->() MATCH ()-[]->(r0) RETURN r0 ^ SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r0:e1]->() MATCH ()-[r0:e2]->() RETURN r0 $$) AS (r0 agtype); ERROR: multiple labels for variable 'r0' are not supported LINE 2: MATCH ()-[r0:e1]->() MATCH ()-[r0:e2]->() RETURN r0 ^ SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r0]->() MATCH ()-[r0:e2]->() RETURN r0 $$) AS (r0 agtype); ERROR: multiple labels for variable 'r0' are not supported LINE 2: MATCH ()-[r0]->() MATCH ()-[r0:e2]->() RETURN r0 ^ SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r0:e1]->() MATCH ()-[r0:e2]->() RETURN r0 $$) AS (r0 agtype); ERROR: multiple labels for variable 'r0' are not supported LINE 2: MATCH ()-[r0:e1]->() MATCH ()-[r0:e2]->() RETURN r0 ^ SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r0:e1]->()-[r0]->() MATCH ()-[r0:e2]->() RETURN r0 $$) AS (r0 agtype); ERROR: duplicate edge variable 'r0' within a clause LINE 2: MATCH ()-[r0:e1]->()-[r0]->() MATCH ()-[r0:e2]->() R... ^ SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r0:e1]->()-[r1]->() MATCH ()-[r1:e1]->()-[r0]->() RETURN r0 $$) AS (r0 agtype); ERROR: multiple labels for variable 'r1' are not supported LINE 2: MATCH ()-[r0:e1]->()-[r1]->() MATCH ()-[r1:e1]->()-[... ^ -- Labels that don't exist but do match SELECT * FROM cypher('cypher_match', $$ MATCH (r0)-[r1:related]->() MATCH ()-[r1:related]->() RETURN r0 $$) AS (r0 agtype); r0 ---- (0 rows) -- Labels that don't exist and don't match SELECT * FROM cypher('cypher_match', $$ MATCH (r0)-[r1]->() MATCH ()-[r1:related]->() RETURN r0 $$) AS (r0 agtype); ERROR: multiple labels for variable 'r1' are not supported LINE 2: MATCH (r0)-[r1]->() MATCH ()-[r1:related]->() RETURN... ^ SELECT * FROM cypher('cypher_match', $$ MATCH (r0)-[r1:related]->() MATCH ()-[r1:relateds]->() RETURN r0 $$) AS (r0 agtype); ERROR: multiple labels for variable 'r1' are not supported LINE 2: MATCH (r0)-[r1:related]->() MATCH ()-[r1:relateds]->... ^ --Valid variable reuse, although why would you want to do it this way? SELECT * FROM cypher('cypher_match', $$ MATCH (a:v1)-[]-()-[]-(a {id:'will_not_fail'}) RETURN a $$) AS (a agtype); a --- (0 rows) --Incorrect Labels SELECT * FROM cypher('cypher_match', $$MATCH (n)-[:v]-() RETURN n$$) AS (n agtype); n --- (0 rows) SELECT * FROM cypher('cypher_match', $$MATCH (n)-[:emissing]-() RETURN n$$) AS (n agtype); n --- (0 rows) SELECT * FROM cypher('cypher_match', $$MATCH (n:e1)-[]-() RETURN n$$) AS (n agtype); n --- (0 rows) SELECT * FROM cypher('cypher_match', $$MATCH (n:vmissing)-[]-() RETURN n$$) AS (n agtype); n --- (0 rows) SELECT * FROM cypher('cypher_match', $$MATCH (:e1)-[r]-() RETURN r$$) AS (r agtype); r --- (0 rows) SELECT * FROM cypher('cypher_match', $$MATCH (:vmissing)-[r]-() RETURN r$$) AS (r agtype); r --- (0 rows) SELECT * FROM cypher('cypher_match', $$MATCH (n),(:e1) RETURN n$$) AS (n agtype); n --- (0 rows) SELECT * FROM cypher('cypher_match', $$MATCH (n),()-[:v]-() RETURN n$$) AS (n agtype); n --- (0 rows) -- -- Path of one vertex. This should select 14 -- SELECT * FROM cypher('cypher_match', $$ MATCH p=() RETURN p $$) AS (p agtype); p --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 281474976710657, "label": "", "properties": {"int_key": 1, "map_key": {"key": "value"}, "list_key": [1, 2, 3], "float_key": 3.14, "string_key": "test"}}::vertex]::path [{"id": 281474976710658, "label": "", "properties": {"lst": [1, null, 3.14, "string", {"key": "value"}, []]}}::vertex]::path [{"id": 844424930131969, "label": "v", "properties": {}}::vertex]::path [{"id": 844424930131970, "label": "v", "properties": {"i": 0}}::vertex]::path [{"id": 844424930131971, "label": "v", "properties": {"i": 1}}::vertex]::path [{"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex]::path [{"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex]::path [{"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex]::path [{"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex]::path [{"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex]::path [{"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex]::path [{"id": 2251799813685249, "label": "v3", "properties": {"id": "initial"}}::vertex]::path [{"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex]::path [{"id": 2251799813685251, "label": "v3", "properties": {"id": "end"}}::vertex]::path (14 rows) -- -- MATCH with WHERE EXISTS(pattern) -- SELECT * FROM cypher('cypher_match', $$MATCH (u)-[e]->(v) RETURN u, e, v $$) AS (u agtype, e agtype, v agtype); u | e | v ----------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------- {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex | {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge | {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex | {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge | {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex | {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge | {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex | {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge | {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex {"id": 2251799813685249, "label": "v3", "properties": {"id": "initial"}}::vertex | {"id": 2533274790395906, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685249, "properties": {}}::edge | {"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex {"id": 2251799813685251, "label": "v3", "properties": {"id": "end"}}::vertex | {"id": 2533274790395905, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685251, "properties": {}}::edge | {"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex (6 rows) SELECT * FROM cypher('cypher_match', $$MATCH (u)-[e]->(v) WHERE EXISTS((u)-[e]->(v)) RETURN u, e, v $$) AS (u agtype, e agtype, v agtype); u | e | v ----------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------- {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex | {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge | {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex | {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge | {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex | {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge | {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex | {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge | {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex {"id": 2251799813685249, "label": "v3", "properties": {"id": "initial"}}::vertex | {"id": 2533274790395906, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685249, "properties": {}}::edge | {"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex {"id": 2251799813685251, "label": "v3", "properties": {"id": "end"}}::vertex | {"id": 2533274790395905, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685251, "properties": {}}::edge | {"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex (6 rows) -- Property Constraint in EXISTS SELECT * FROM cypher('cypher_match', $$MATCH (u) WHERE EXISTS((u)-[]->({id: "middle"})) RETURN u $$) AS (u agtype); u ---------------------------------------------------------------------------------- {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex {"id": 2251799813685249, "label": "v3", "properties": {"id": "initial"}}::vertex {"id": 2251799813685251, "label": "v3", "properties": {"id": "end"}}::vertex (3 rows) SELECT * FROM cypher('cypher_match', $$MATCH (u) WHERE EXISTS((u)-[]->({id: "not a valid id"})) RETURN u $$) AS (u agtype); u --- (0 rows) SELECT * FROM cypher('cypher_match', $$MATCH (u) WHERE EXISTS((u)-[]->({id: NULL})) RETURN u $$) AS (u agtype); u --- (0 rows) -- Exists checks for a loop. There shouldn't be any. SELECT * FROM cypher('cypher_match', $$MATCH (u)-[e]->(v) WHERE EXISTS((u)-[e]->(u)) RETURN u, e, v $$) AS (u agtype, e agtype, v agtype); u | e | v ---+---+--- (0 rows) -- Create a loop SELECT * FROM cypher('cypher_match', $$ CREATE (u:loop {id:'initial'})-[:self]->(u) $$) AS (a agtype); a --- (0 rows) -- dump paths SELECT * FROM cypher('cypher_match', $$MATCH (u)-[e]->(v) WHERE EXISTS((u)-[e]->(v)) RETURN u, e, v $$) AS (u agtype, e agtype, v agtype); u | e | v ------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------ {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex | {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge | {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex | {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge | {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex | {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge | {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex | {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge | {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex {"id": 2251799813685249, "label": "v3", "properties": {"id": "initial"}}::vertex | {"id": 2533274790395906, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685249, "properties": {}}::edge | {"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex {"id": 2251799813685251, "label": "v3", "properties": {"id": "end"}}::vertex | {"id": 2533274790395905, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685251, "properties": {}}::edge | {"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex {"id": 2814749767106561, "label": "loop", "properties": {"id": "initial"}}::vertex | {"id": 3096224743817217, "label": "self", "end_id": 2814749767106561, "start_id": 2814749767106561, "properties": {}}::edge | {"id": 2814749767106561, "label": "loop", "properties": {"id": "initial"}}::vertex (7 rows) -- Exists checks for a loop. There should be one. SELECT * FROM cypher('cypher_match', $$MATCH (u)-[e]->(v) WHERE EXISTS((u)-[e]->(u)) RETURN u, e, v $$) AS (u agtype, e agtype, v agtype); u | e | v ------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------ {"id": 2814749767106561, "label": "loop", "properties": {"id": "initial"}}::vertex | {"id": 3096224743817217, "label": "self", "end_id": 2814749767106561, "start_id": 2814749767106561, "properties": {}}::edge | {"id": 2814749767106561, "label": "loop", "properties": {"id": "initial"}}::vertex (1 row) -- Exists checks for a loop. There should be one. SELECT * FROM cypher('cypher_match', $$MATCH (u)-[e]->(v) WHERE EXISTS((v)-[e]->(v)) RETURN u, e, v $$) AS (u agtype, e agtype, v agtype); u | e | v ------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------ {"id": 2814749767106561, "label": "loop", "properties": {"id": "initial"}}::vertex | {"id": 3096224743817217, "label": "self", "end_id": 2814749767106561, "start_id": 2814749767106561, "properties": {}}::edge | {"id": 2814749767106561, "label": "loop", "properties": {"id": "initial"}}::vertex (1 row) -- Multiple exists SELECT * FROM cypher('cypher_match', $$MATCH (u)-[e]->(v) WHERE EXISTS((u)) AND EXISTS((v)) RETURN u, e, v $$) AS (u agtype, e agtype, v agtype); u | e | v ------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------ {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex | {"id": 1407374883553282, "label": "e1", "end_id": 1125899906842626, "start_id": 1125899906842625, "properties": {}}::edge | {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex | {"id": 1407374883553281, "label": "e1", "end_id": 1125899906842627, "start_id": 1125899906842626, "properties": {}}::edge | {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex | {"id": 1970324836974594, "label": "e2", "end_id": 1688849860263937, "start_id": 1688849860263938, "properties": {}}::edge | {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex | {"id": 1970324836974593, "label": "e2", "end_id": 1688849860263939, "start_id": 1688849860263938, "properties": {}}::edge | {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex {"id": 2251799813685249, "label": "v3", "properties": {"id": "initial"}}::vertex | {"id": 2533274790395906, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685249, "properties": {}}::edge | {"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex {"id": 2251799813685251, "label": "v3", "properties": {"id": "end"}}::vertex | {"id": 2533274790395905, "label": "e3", "end_id": 2251799813685250, "start_id": 2251799813685251, "properties": {}}::edge | {"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex {"id": 2814749767106561, "label": "loop", "properties": {"id": "initial"}}::vertex | {"id": 3096224743817217, "label": "self", "end_id": 2814749767106561, "start_id": 2814749767106561, "properties": {}}::edge | {"id": 2814749767106561, "label": "loop", "properties": {"id": "initial"}}::vertex (7 rows) SELECT * FROM cypher('cypher_match', $$MATCH (u)-[e]->(v) WHERE EXISTS((u)-[e]->(u)) AND EXISTS((v)-[e]->(v)) RETURN u, e, v $$) AS (u agtype, e agtype, v agtype); u | e | v ------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------ {"id": 2814749767106561, "label": "loop", "properties": {"id": "initial"}}::vertex | {"id": 3096224743817217, "label": "self", "end_id": 2814749767106561, "start_id": 2814749767106561, "properties": {}}::edge | {"id": 2814749767106561, "label": "loop", "properties": {"id": "initial"}}::vertex (1 row) -- Return exists(pattern) SELECT * FROM cypher('cypher_match', $$MATCH (u) RETURN EXISTS((u)-[]->()) $$) AS (exists agtype); exists -------- false false false false false true true false false true false true false true true (15 rows) SELECT * FROM cypher('cypher_match', $$MATCH p=(u)-[e]->(v) RETURN EXISTS((p)) $$) AS (exists agtype); exists -------- true true true true true true true (7 rows) SELECT * FROM cypher('cypher_match', $$MATCH (u)-[e]->(v) RETURN EXISTS((u)-[e]->(v)-[e]->(u))$$) AS (exists agtype); exists -------- false false false false false false false (7 rows) -- These should error -- Bad pattern SELECT * FROM cypher('cypher_match', $$MATCH (u)-[e]->(v) WHERE EXISTS((u)) AND EXISTS([e]) AND EXISTS((v)) RETURN u, e, v $$) AS (u agtype, e agtype, v agtype); ERROR: syntax error at or near "[" LINE 2: ...$$MATCH (u)-[e]->(v) WHERE EXISTS((u)) AND EXISTS([e]) AND E... ^ -- variable creation error SELECT * FROM cypher('cypher_match', $$MATCH (u)-[e]->(v) WHERE EXISTS((u)-[e]->(x)) RETURN u, e, v $$) AS (u agtype, e agtype, v agtype); ERROR: variable `x` does not exist LINE 2: $$MATCH (u)-[e]->(v) WHERE EXISTS((u)-[e]->(x)) RETURN u, e... ^ -- -- Tests for EXISTS(property) -- -- dump all vertices SELECT * FROM cypher('cypher_match', $$MATCH (u) RETURN u $$) AS (u agtype); u ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"int_key": 1, "map_key": {"key": "value"}, "list_key": [1, 2, 3], "float_key": 3.14, "string_key": "test"}}::vertex {"id": 281474976710658, "label": "", "properties": {"lst": [1, null, 3.14, "string", {"key": "value"}, []]}}::vertex {"id": 844424930131969, "label": "v", "properties": {}}::vertex {"id": 844424930131970, "label": "v", "properties": {"i": 0}}::vertex {"id": 844424930131971, "label": "v", "properties": {"i": 1}}::vertex {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex {"id": 2251799813685249, "label": "v3", "properties": {"id": "initial"}}::vertex {"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex {"id": 2251799813685251, "label": "v3", "properties": {"id": "end"}}::vertex {"id": 2814749767106561, "label": "loop", "properties": {"id": "initial"}}::vertex (15 rows) -- select vertices with id as a property SELECT * FROM cypher('cypher_match', $$MATCH (u) WHERE EXISTS(u.id) RETURN u $$) AS (u agtype); u ------------------------------------------------------------------------------------ {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex {"id": 2251799813685249, "label": "v3", "properties": {"id": "initial"}}::vertex {"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex {"id": 2251799813685251, "label": "v3", "properties": {"id": "end"}}::vertex {"id": 2814749767106561, "label": "loop", "properties": {"id": "initial"}}::vertex (10 rows) -- select vertices without id as a property SELECT * FROM cypher('cypher_match', $$MATCH (u) WHERE NOT EXISTS(u.id) RETURN u $$) AS (u agtype); u ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"int_key": 1, "map_key": {"key": "value"}, "list_key": [1, 2, 3], "float_key": 3.14, "string_key": "test"}}::vertex {"id": 281474976710658, "label": "", "properties": {"lst": [1, null, 3.14, "string", {"key": "value"}, []]}}::vertex {"id": 844424930131969, "label": "v", "properties": {}}::vertex {"id": 844424930131970, "label": "v", "properties": {"i": 0}}::vertex {"id": 844424930131971, "label": "v", "properties": {"i": 1}}::vertex (5 rows) -- select vertices without id as a property but with a property i SELECT * FROM cypher('cypher_match', $$MATCH (u) WHERE NOT EXISTS(u.id) AND EXISTS(u.i) RETURN u $$) AS (u agtype); u ----------------------------------------------------------------------- {"id": 844424930131970, "label": "v", "properties": {"i": 0}}::vertex {"id": 844424930131971, "label": "v", "properties": {"i": 1}}::vertex (2 rows) -- select vertices with id as a property and have a self loop SELECT * FROM cypher('cypher_match', $$MATCH (u) WHERE EXISTS(u.id) AND EXISTS((u)-[]->(u)) RETURN u$$) AS (u agtype); u ------------------------------------------------------------------------------------ {"id": 2814749767106561, "label": "loop", "properties": {"id": "initial"}}::vertex (1 row) -- Return exists(property) SELECT * FROM cypher('cypher_match', $$MATCH (u) RETURN EXISTS(u.id), properties(u) $$) AS (exists agtype, properties agtype); exists | properties --------+------------------------------------------------------------------------------------------------------------- false | {"int_key": 1, "map_key": {"key": "value"}, "list_key": [1, 2, 3], "float_key": 3.14, "string_key": "test"} false | {"lst": [1, null, 3.14, "string", {"key": "value"}, []]} false | {} false | {"i": 0} false | {"i": 1} true | {"id": "initial"} true | {"id": "middle"} true | {"id": "end"} true | {"id": "initial"} true | {"id": "middle"} true | {"id": "end"} true | {"id": "initial"} true | {"id": "middle"} true | {"id": "end"} true | {"id": "initial"} (15 rows) SELECT * FROM cypher('cypher_match', $$MATCH (u) RETURN EXISTS(u.name), properties(u) $$) AS (exists agtype, properties agtype); exists | properties --------+------------------------------------------------------------------------------------------------------------- false | {"int_key": 1, "map_key": {"key": "value"}, "list_key": [1, 2, 3], "float_key": 3.14, "string_key": "test"} false | {"lst": [1, null, 3.14, "string", {"key": "value"}, []]} false | {} false | {"i": 0} false | {"i": 1} false | {"id": "initial"} false | {"id": "middle"} false | {"id": "end"} false | {"id": "initial"} false | {"id": "middle"} false | {"id": "end"} false | {"id": "initial"} false | {"id": "middle"} false | {"id": "end"} false | {"id": "initial"} (15 rows) -- should give an error SELECT * FROM cypher('cypher_match', $$MATCH (u) WHERE EXISTS(u) RETURN u$$) AS (u agtype); ERROR: syntax error at or near ")" LINE 2: $$MATCH (u) WHERE EXISTS(u) RETURN u$$) ^ -- -- MATCH with WHERE isEmpty(property) -- SELECT create_graph('for_isEmpty'); NOTICE: graph "for_isEmpty" has been created create_graph -------------- (1 row) -- Create vertices SELECT * FROM cypher('for_isEmpty', $$CREATE (u:for_pred {id:1, type: "empty", list: [], map: {}, string: ""}), (v:for_pred {id:2, type: "filled", list: [1], map: {a:1}, string: "a"}), (w:for_pred)$$) AS (a agtype); a --- (0 rows) -- Match vertices with empty properties SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) WHERE isEmpty(u.list) RETURN properties(u) $$) AS (u agtype); u ----------------------------------------------------------------- {"id": 1, "map": {}, "list": [], "type": "empty", "string": ""} (1 row) SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) WHERE isEmpty(u.map) RETURN properties(u) $$) AS (u agtype); u ----------------------------------------------------------------- {"id": 1, "map": {}, "list": [], "type": "empty", "string": ""} (1 row) SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) WHERE isEmpty(u.string) RETURN properties(u) $$) AS (u agtype); u ----------------------------------------------------------------- {"id": 1, "map": {}, "list": [], "type": "empty", "string": ""} (1 row) -- Match vertices with non-empty properties SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) WHERE NOT isEmpty(u.list) RETURN properties(u) $$) AS (u agtype); u -------------------------------------------------------------------------- {"id": 2, "map": {"a": 1}, "list": [1], "type": "filled", "string": "a"} (1 row) SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) WHERE NOT isEmpty(u.map) RETURN properties(u) $$) AS (u agtype); u -------------------------------------------------------------------------- {"id": 2, "map": {"a": 1}, "list": [1], "type": "filled", "string": "a"} (1 row) SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) WHERE NOT isEmpty(u.string) RETURN properties(u) $$) AS (u agtype); u -------------------------------------------------------------------------- {"id": 2, "map": {"a": 1}, "list": [1], "type": "filled", "string": "a"} (1 row) -- Match vertices with no properties SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) WHERE isEmpty(properties(u)) RETURN properties(u) $$) AS (u agtype); u ---- {} (1 row) -- Match vertices with properties SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) WHERE NOT isEmpty(properties(u)) RETURN properties(u) $$) AS (u agtype); u -------------------------------------------------------------------------- {"id": 1, "map": {}, "list": [], "type": "empty", "string": ""} {"id": 2, "map": {"a": 1}, "list": [1], "type": "filled", "string": "a"} (2 rows) -- Match vertices with null property (should return nothing since WHERE null) SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) WHERE isEmpty(u.tree) RETURN properties(u) $$) AS (u agtype); u --- (0 rows) -- Match and Return bool SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) WHERE isEmpty(u.list) RETURN isEmpty(u.list), u.type $$) AS (b agtype, type agtype); b | type ------+--------- true | "empty" (1 row) SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) WHERE NOT isEmpty(u.list) RETURN isEmpty(u.list), u.type $$) AS (b agtype, type agtype); b | type -------+---------- false | "filled" (1 row) -- Return null on null SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) RETURN isEmpty(u.tree) $$) AS (b agtype); b --- (3 rows) -- Should give an error SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) WHERE isEmpty(u) RETURN properties(u) $$) AS (u agtype); ERROR: isEmpty() unsupported argument, expected a List, Map, or String SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) WHERE isEmpty(1) RETURN properties(u) $$) AS (u agtype); ERROR: isEmpty() unsupported argument, expected a List, Map, or String SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) WHERE isEmpty(1,2,3) RETURN properties(u) $$) AS (u agtype); ERROR: function ag_catalog.age_isempty(agtype, agtype, agtype) does not exist LINE 2: $$MATCH (u:for_pred) WHERE isEmpty(1,2,3) RETURN properties... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. SELECT * FROM cypher('for_isEmpty', $$MATCH (u:for_pred) WHERE isEmpty() RETURN properties(u) $$) AS (u agtype); ERROR: function ag_catalog.age_isempty() does not exist LINE 2: $$MATCH (u:for_pred) WHERE isEmpty() RETURN properties(u) $... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. -- clean up SELECT drop_graph('for_isEmpty', true); NOTICE: drop cascades to 3 other objects DETAIL: drop cascades to table "for_isEmpty"._ag_label_vertex drop cascades to table "for_isEmpty"._ag_label_edge drop cascades to table "for_isEmpty".for_pred NOTICE: graph "for_isEmpty" has been dropped drop_graph ------------ (1 row) -- --Distinct -- SELECT * FROM cypher('cypher_match', $$ MATCH (u) RETURN DISTINCT u.id $$) AS (i agtype); i ----------- "end" "initial" "middle" (4 rows) SELECT * FROM cypher('cypher_match', $$ CREATE (u:duplicate)-[:dup_edge {id:1 }]->(:other_v) $$) AS (a agtype); a --- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (u:duplicate) CREATE (u)-[:dup_edge {id:2 }]->(:other_v) $$) AS (a agtype); a --- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (u:duplicate)-[]-(:other_v) RETURN DISTINCT u $$) AS (i agtype); i -------------------------------------------------------------------------- {"id": 3377699720527873, "label": "duplicate", "properties": {}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH p=(:duplicate)-[]-(:other_v) RETURN DISTINCT p $$) AS (i agtype); i -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 3377699720527873, "label": "duplicate", "properties": {}}::vertex, {"id": 3659174697238529, "label": "dup_edge", "end_id": 3940649673949185, "start_id": 3377699720527873, "properties": {"id": 1}}::edge, {"id": 3940649673949185, "label": "other_v", "properties": {}}::vertex]::path [{"id": 3377699720527873, "label": "duplicate", "properties": {}}::vertex, {"id": 3659174697238530, "label": "dup_edge", "end_id": 3940649673949186, "start_id": 3377699720527873, "properties": {"id": 2}}::edge, {"id": 3940649673949186, "label": "other_v", "properties": {}}::vertex]::path (2 rows) -- -- Limit -- SELECT * FROM cypher('cypher_match', $$ MATCH (u) RETURN u $$) AS (i agtype); i ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"int_key": 1, "map_key": {"key": "value"}, "list_key": [1, 2, 3], "float_key": 3.14, "string_key": "test"}}::vertex {"id": 281474976710658, "label": "", "properties": {"lst": [1, null, 3.14, "string", {"key": "value"}, []]}}::vertex {"id": 844424930131969, "label": "v", "properties": {}}::vertex {"id": 844424930131970, "label": "v", "properties": {"i": 0}}::vertex {"id": 844424930131971, "label": "v", "properties": {"i": 1}}::vertex {"id": 1125899906842625, "label": "v1", "properties": {"id": "initial"}}::vertex {"id": 1125899906842626, "label": "v1", "properties": {"id": "middle"}}::vertex {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex {"id": 2251799813685249, "label": "v3", "properties": {"id": "initial"}}::vertex {"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex {"id": 2251799813685251, "label": "v3", "properties": {"id": "end"}}::vertex {"id": 2814749767106561, "label": "loop", "properties": {"id": "initial"}}::vertex {"id": 3377699720527873, "label": "duplicate", "properties": {}}::vertex {"id": 3940649673949185, "label": "other_v", "properties": {}}::vertex {"id": 3940649673949186, "label": "other_v", "properties": {}}::vertex (18 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (u) RETURN u LIMIT 3 $$) AS (i agtype); i ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"int_key": 1, "map_key": {"key": "value"}, "list_key": [1, 2, 3], "float_key": 3.14, "string_key": "test"}}::vertex {"id": 281474976710658, "label": "", "properties": {"lst": [1, null, 3.14, "string", {"key": "value"}, []]}}::vertex {"id": 844424930131969, "label": "v", "properties": {}}::vertex (3 rows) -- -- Skip -- SELECT * FROM cypher('cypher_match', $$ MATCH (u) RETURN u SKIP 7 $$) AS (i agtype); i ------------------------------------------------------------------------------------ {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex {"id": 1688849860263939, "label": "v2", "properties": {"id": "end"}}::vertex {"id": 2251799813685249, "label": "v3", "properties": {"id": "initial"}}::vertex {"id": 2251799813685250, "label": "v3", "properties": {"id": "middle"}}::vertex {"id": 2251799813685251, "label": "v3", "properties": {"id": "end"}}::vertex {"id": 2814749767106561, "label": "loop", "properties": {"id": "initial"}}::vertex {"id": 3377699720527873, "label": "duplicate", "properties": {}}::vertex {"id": 3940649673949185, "label": "other_v", "properties": {}}::vertex {"id": 3940649673949186, "label": "other_v", "properties": {}}::vertex (11 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (u) RETURN u SKIP 7 LIMIT 3 $$) AS (i agtype); i ---------------------------------------------------------------------------------- {"id": 1125899906842627, "label": "v1", "properties": {"id": "end"}}::vertex {"id": 1688849860263937, "label": "v2", "properties": {"id": "initial"}}::vertex {"id": 1688849860263938, "label": "v2", "properties": {"id": "middle"}}::vertex (3 rows) -- -- Optional Match -- SELECT * FROM cypher('cypher_match', $$ CREATE (:opt_match_v {name: 'someone'})-[:opt_match_e]->(:opt_match_v {name: 'somebody'}), (:opt_match_v {name: 'anybody'})-[:opt_match_e]->(:opt_match_v {name: 'nobody'}) $$) AS (u agtype); u --- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (u:opt_match_v) OPTIONAL MATCH (u)-[m]-(l) RETURN u.name as u, type(m), l.name as l ORDER BY u, m, l $$) AS (u agtype, m agtype, l agtype); u | m | l ------------+---------------+------------ "someone" | "opt_match_e" | "somebody" "somebody" | "opt_match_e" | "someone" "anybody" | "opt_match_e" | "nobody" "nobody" | "opt_match_e" | "anybody" (4 rows) SELECT * FROM cypher('cypher_match', $$ OPTIONAL MATCH (n:opt_match_v)-[r]->(p), (m:opt_match_v)-[s]->(q) WHERE id(n) <> id(m) RETURN n.name as n, type(r) AS r, p.name as p, m.name AS m, type(s) AS s, q.name AS q ORDER BY n, p, m, q $$) AS (n agtype, r agtype, p agtype, m agtype, s agtype, q agtype); n | r | p | m | s | q -----------+---------------+------------+-----------+---------------+------------ "someone" | "opt_match_e" | "somebody" | "anybody" | "opt_match_e" | "nobody" "anybody" | "opt_match_e" | "nobody" | "someone" | "opt_match_e" | "somebody" (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (n:opt_match_v), (m:opt_match_v) WHERE id(n) <> id(m) OPTIONAL MATCH (n)-[r]->(p), (m)-[s]->(q) RETURN n.name AS n, type(r) AS r, p.name AS p, m.name AS m, type(s) AS s, q.name AS q ORDER BY n, p, m, q $$) AS (n agtype, r agtype, p agtype, m agtype, s agtype, q agtype); n | r | p | m | s | q ------------+---------------+------------+------------+---------------+------------ "someone" | "opt_match_e" | "somebody" | "anybody" | "opt_match_e" | "nobody" "someone" | | | "somebody" | | "someone" | | | "nobody" | | "somebody" | | | "someone" | | "somebody" | | | "anybody" | | "somebody" | | | "nobody" | | "anybody" | "opt_match_e" | "nobody" | "someone" | "opt_match_e" | "somebody" "anybody" | | | "somebody" | | "anybody" | | | "nobody" | | "nobody" | | | "someone" | | "nobody" | | | "somebody" | | "nobody" | | | "anybody" | | (12 rows) -- Tests to catch match following optional match logic -- this syntax is invalid in cypher SELECT * FROM cypher('cypher_match', $$ OPTIONAL MATCH (n) MATCH (m) RETURN n,m $$) AS (n agtype, m agtype); ERROR: MATCH cannot follow OPTIONAL MATCH LINE 1: SELECT * FROM cypher('cypher_match', $$ ^ SELECT * FROM cypher('cypher_match', $$ MATCH (n) OPTIONAL MATCH (m) MATCH (o) RETURN n,m $$) AS (n agtype, m agtype); ERROR: MATCH cannot follow OPTIONAL MATCH LINE 1: SELECT * FROM cypher('cypher_match', $$ ^ -- -- Tests retrieving Var from some parent's cpstate during transformation -- SELECT create_graph('test_retrieve_var'); NOTICE: graph "test_retrieve_var" has been created create_graph -------------- (1 row) SELECT * FROM cypher('test_retrieve_var', $$ CREATE (:A)-[:incs]->(:C) $$) as (a agtype); a --- (0 rows) -- Tests with node Var -- both queries should return the same result -- first query does not retrieve any variable from any parent's cpstate -- second query retrieves variable 'a', inside WHERE, from parent's parent's cpstate SELECT * FROM cypher('test_retrieve_var', $$ MATCH (a:A) WITH a OPTIONAL MATCH (a)-[:incs]->(c) WHERE EXISTS((c)<-[:incs]-()) RETURN a, c $$) AS (a agtype, c agtype); a | c -----------------------------------------------------------------+------------------------------------------------------------------ {"id": 844424930131969, "label": "A", "properties": {}}::vertex | {"id": 1407374883553281, "label": "C", "properties": {}}::vertex (1 row) SELECT * FROM cypher('test_retrieve_var', $$ MATCH (a:A) WITH a OPTIONAL MATCH (a)-[:incs]->(c) WHERE EXISTS((c)<-[:incs]-(a)) RETURN a, c $$) AS (a agtype, c agtype); a | c -----------------------------------------------------------------+------------------------------------------------------------------ {"id": 844424930131969, "label": "A", "properties": {}}::vertex | {"id": 1407374883553281, "label": "C", "properties": {}}::vertex (1 row) -- Tests with edge Var -- both queries should return the same result -- first query does not retrieve any variable from any parent's cpstate -- second query retrieves variable 'r', inside WHERE, from parent's parent's cpstate SELECT * FROM cypher('test_retrieve_var', $$ MATCH (a:A)-[r:incs]->() WITH a, r OPTIONAL MATCH (a)-[r]->(c) WHERE EXISTS(()<-[]-(c)) RETURN a, r $$) AS (a agtype, r agtype); a | r -----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------- {"id": 844424930131969, "label": "A", "properties": {}}::vertex | {"id": 1125899906842625, "label": "incs", "end_id": 1407374883553281, "start_id": 844424930131969, "properties": {}}::edge (1 row) SELECT * FROM cypher('test_retrieve_var', $$ MATCH (a:A)-[r:incs]->() WITH a, r OPTIONAL MATCH (a)-[r]->(c) WHERE EXISTS((:A)<-[]-(c)) RETURN a, r $$) AS (a agtype, r agtype); a | r -----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------- {"id": 844424930131969, "label": "A", "properties": {}}::vertex | {"id": 1125899906842625, "label": "incs", "end_id": 1407374883553281, "start_id": 844424930131969, "properties": {}}::edge (1 row) SELECT * FROM cypher('test_retrieve_var', $$ MATCH (a:A)-[r:incs]->() WITH a, r OPTIONAL MATCH (a)-[r]->(c) WHERE EXISTS((c)<-[]-(:A)) RETURN a, r $$) AS (a agtype, r agtype); a | r -----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------- {"id": 844424930131969, "label": "A", "properties": {}}::vertex | {"id": 1125899906842625, "label": "incs", "end_id": 1407374883553281, "start_id": 844424930131969, "properties": {}}::edge (1 row) SELECT * FROM cypher('test_retrieve_var', $$ MATCH (a:A)-[r:incs]->() WITH a, r OPTIONAL MATCH (a)-[r]->(c) WHERE EXISTS((:C)<-[]-(:A)) RETURN a, r $$) AS (a agtype, r agtype); a | r -----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------- {"id": 844424930131969, "label": "A", "properties": {}}::vertex | {"id": 1125899906842625, "label": "incs", "end_id": 1407374883553281, "start_id": 844424930131969, "properties": {}}::edge (1 row) SELECT * FROM cypher('test_retrieve_var', $$ MATCH (a:A)-[r:incs]->() WITH a, r OPTIONAL MATCH (a)-[r]->(c) WHERE EXISTS(()<-[r]-(c)) RETURN a, r $$) AS (a agtype, r agtype); a | r -----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------- {"id": 844424930131969, "label": "A", "properties": {}}::vertex | {"id": 1125899906842625, "label": "incs", "end_id": 1407374883553281, "start_id": 844424930131969, "properties": {}}::edge (1 row) -- -- JIRA: AGE2-544 -- -- Clean up SELECT DISTINCT * FROM cypher('cypher_match', $$ MATCH (u) DETACH DELETE (u) $$) AS (i agtype); i --- (0 rows) -- Prepare SELECT * FROM cypher('cypher_match', $$ CREATE (u {name: "orphan"}) CREATE (u1 {name: "F"})-[u2:e1]->(u3 {name: "T"}) RETURN u1, u2, u3 $$) as (u1 agtype, u2 agtype, u3 agtype); u1 | u2 | u3 ---------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------- {"id": 281474976710660, "label": "", "properties": {"name": "F"}}::vertex | {"id": 1407374883553283, "label": "e1", "end_id": 281474976710661, "start_id": 281474976710660, "properties": {}}::edge | {"id": 281474976710661, "label": "", "properties": {"name": "T"}}::vertex (1 row) -- Querying NOT EXISTS syntax SELECT * FROM cypher('cypher_match', $$ MATCH (f),(t) WHERE NOT EXISTS((f)-[]->(t)) RETURN f.name, t.name $$) as (f agtype, t agtype); f | t ----------+---------- "orphan" | "orphan" "orphan" | "F" "orphan" | "T" "F" | "orphan" "F" | "F" "T" | "orphan" "T" | "F" "T" | "T" (8 rows) -- Querying EXISTS syntax SELECT * FROM cypher('cypher_match', $$ MATCH (f),(t) WHERE EXISTS((f)-[]->(t)) RETURN f.name, t.name $$) as (f agtype, t agtype); f | t -----+----- "F" | "T" (1 row) -- Querying ALL SELECT * FROM cypher('cypher_match', $$ MATCH (f),(t) WHERE NOT EXISTS((f)-[]->(t)) or true RETURN f.name, t.name $$) as (f agtype, t agtype); f | t ----------+---------- "orphan" | "orphan" "orphan" | "F" "orphan" | "T" "F" | "orphan" "F" | "F" "F" | "T" "T" | "orphan" "T" | "F" "T" | "T" (9 rows) -- Querying ALL SELECT * FROM cypher('cypher_match', $$ MATCH (f),(t) RETURN f.name, t.name $$) as (f agtype, t agtype); f | t ----------+---------- "orphan" | "orphan" "orphan" | "F" "orphan" | "T" "F" | "orphan" "F" | "F" "F" | "T" "T" | "orphan" "T" | "F" "T" | "T" (9 rows) -- -- Constraints and WHERE clause together -- SELECT * FROM cypher('cypher_match', $$ CREATE ({i: 1, j: 2, k: 3}), ({i: 1, j: 3}), ({i:2, k: 3}) $$) as (a agtype); a --- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (n {j: 2}) WHERE n.i = 1 RETURN n $$) as (n agtype); n -------------------------------------------------------------------------------------- {"id": 281474976710662, "label": "", "properties": {"i": 1, "j": 2, "k": 3}}::vertex (1 row) -- -- Regression tests to check previous clause variable refs -- -- set up initial state and show what we're working with SELECT * FROM cypher('cypher_match', $$ CREATE (a {age: 4}) RETURN a $$) as (a agtype); a ------------------------------------------------------------------------ {"id": 281474976710665, "label": "", "properties": {"age": 4}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ CREATE (b {age: 6}) RETURN b $$) as (b agtype); b ------------------------------------------------------------------------ {"id": 281474976710666, "label": "", "properties": {"age": 6}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH (a) RETURN a $$) as (a agtype); a -------------------------------------------------------------------------------------- {"id": 281474976710659, "label": "", "properties": {"name": "orphan"}}::vertex {"id": 281474976710660, "label": "", "properties": {"name": "F"}}::vertex {"id": 281474976710661, "label": "", "properties": {"name": "T"}}::vertex {"id": 281474976710662, "label": "", "properties": {"i": 1, "j": 2, "k": 3}}::vertex {"id": 281474976710663, "label": "", "properties": {"i": 1, "j": 3}}::vertex {"id": 281474976710664, "label": "", "properties": {"i": 2, "k": 3}}::vertex {"id": 281474976710665, "label": "", "properties": {"age": 4}}::vertex {"id": 281474976710666, "label": "", "properties": {"age": 6}}::vertex (8 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (a) WHERE exists(a.name) RETURN a $$) as (a agtype); a -------------------------------------------------------------------------------- {"id": 281474976710659, "label": "", "properties": {"name": "orphan"}}::vertex {"id": 281474976710660, "label": "", "properties": {"name": "F"}}::vertex {"id": 281474976710661, "label": "", "properties": {"name": "T"}}::vertex (3 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (a) WHERE exists(a.name) SET a.age = 4 RETURN a $$) as (a agtype); a ------------------------------------------------------------------------------------------ {"id": 281474976710659, "label": "", "properties": {"age": 4, "name": "orphan"}}::vertex {"id": 281474976710660, "label": "", "properties": {"age": 4, "name": "F"}}::vertex {"id": 281474976710661, "label": "", "properties": {"age": 4, "name": "T"}}::vertex (3 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (a),(b) WHERE a.age = 4 AND a.name = "T" AND b.age = 6 RETURN a,b $$) as (a agtype, b agtype); a | b -------------------------------------------------------------------------------------+------------------------------------------------------------------------ {"id": 281474976710661, "label": "", "properties": {"age": 4, "name": "T"}}::vertex | {"id": 281474976710666, "label": "", "properties": {"age": 6}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH (a),(b) WHERE a.age = 4 AND a.name = "T" AND b.age = 6 CREATE (a)-[:knows {relationship: "friends", years: 3}]->(b) $$) as (r agtype); r --- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (a),(b) WHERE a.age = 4 AND a.name = "orphan" AND b.age = 6 CREATE (a)-[:knows {relationship: "enemies", years: 4}]->(b) $$) as (r agtype); r --- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (a)-[r]-(b) RETURN r $$) as (r agtype); r ----------------------------------------------------------------------------------------------------------------------------------------------------------------- {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge {"id": 4785074604081154, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710659, "properties": {"years": 4, "relationship": "enemies"}}::edge {"id": 4785074604081154, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710659, "properties": {"years": 4, "relationship": "enemies"}}::edge {"id": 1407374883553283, "label": "e1", "end_id": 281474976710661, "start_id": 281474976710660, "properties": {}}::edge {"id": 1407374883553283, "label": "e1", "end_id": 281474976710661, "start_id": 281474976710660, "properties": {}}::edge (6 rows) -- check reuse of 'a' clause-to-clause - vertices SELECT * FROM cypher('cypher_match', $$ MATCH (a {age:4}) RETURN a $$) as (a agtype); a ------------------------------------------------------------------------------------------ {"id": 281474976710665, "label": "", "properties": {"age": 4}}::vertex {"id": 281474976710659, "label": "", "properties": {"age": 4, "name": "orphan"}}::vertex {"id": 281474976710660, "label": "", "properties": {"age": 4, "name": "F"}}::vertex {"id": 281474976710661, "label": "", "properties": {"age": 4, "name": "T"}}::vertex (4 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (a) MATCH (a {age:4}) RETURN a $$) as (a agtype); a ------------------------------------------------------------------------------------------ {"id": 281474976710665, "label": "", "properties": {"age": 4}}::vertex {"id": 281474976710659, "label": "", "properties": {"age": 4, "name": "orphan"}}::vertex {"id": 281474976710660, "label": "", "properties": {"age": 4, "name": "F"}}::vertex {"id": 281474976710661, "label": "", "properties": {"age": 4, "name": "T"}}::vertex (4 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (a {age:4, name: "orphan"}) RETURN a $$) as (a agtype); a ------------------------------------------------------------------------------------------ {"id": 281474976710659, "label": "", "properties": {"age": 4, "name": "orphan"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH (a) MATCH (a {age:4}) MATCH (a {name: "orphan"}) RETURN a $$) as (a agtype); a ------------------------------------------------------------------------------------------ {"id": 281474976710659, "label": "", "properties": {"age": 4, "name": "orphan"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH (a {age:4}) MATCH (a {name: "orphan"}) RETURN a $$) as (a agtype); a ------------------------------------------------------------------------------------------ {"id": 281474976710659, "label": "", "properties": {"age": 4, "name": "orphan"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH (a) MATCH (a {age:4}) MATCH (a {name: "orphan"}) SET a.age = 3 RETURN a $$) as (a agtype); a ------------------------------------------------------------------------------------------ {"id": 281474976710659, "label": "", "properties": {"age": 3, "name": "orphan"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH (a) MATCH (a {age:3}) MATCH (a {name: "orphan"}) RETURN a $$) as (a agtype); a ------------------------------------------------------------------------------------------ {"id": 281474976710659, "label": "", "properties": {"age": 3, "name": "orphan"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH (a {name: "orphan"}) MATCH (a {age:3}) RETURN a $$) as (a agtype); a ------------------------------------------------------------------------------------------ {"id": 281474976710659, "label": "", "properties": {"age": 3, "name": "orphan"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH (a) WHERE exists(a.age) AND exists(a.name) RETURN a $$) as (a agtype); a ------------------------------------------------------------------------------------------ {"id": 281474976710660, "label": "", "properties": {"age": 4, "name": "F"}}::vertex {"id": 281474976710661, "label": "", "properties": {"age": 4, "name": "T"}}::vertex {"id": 281474976710659, "label": "", "properties": {"age": 3, "name": "orphan"}}::vertex (3 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (a) WHERE exists(a.age) AND NOT exists(a.name) RETURN a $$) as (a agtype); a ------------------------------------------------------------------------ {"id": 281474976710665, "label": "", "properties": {"age": 4}}::vertex {"id": 281474976710666, "label": "", "properties": {"age": 6}}::vertex (2 rows) -- check reuse of 'r' clause-to-clause - edges SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r]-() RETURN r $$) as (r agtype); r ----------------------------------------------------------------------------------------------------------------------------------------------------------------- {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge {"id": 4785074604081154, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710659, "properties": {"years": 4, "relationship": "enemies"}}::edge {"id": 4785074604081154, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710659, "properties": {"years": 4, "relationship": "enemies"}}::edge {"id": 1407374883553283, "label": "e1", "end_id": 281474976710661, "start_id": 281474976710660, "properties": {}}::edge {"id": 1407374883553283, "label": "e1", "end_id": 281474976710661, "start_id": 281474976710660, "properties": {}}::edge (6 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r]-() MATCH ()-[r {relationship: "friends"}]-() RETURN r $$) as (r agtype); r ----------------------------------------------------------------------------------------------------------------------------------------------------------------- {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge (4 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r {years:3, relationship: "friends"}]-() RETURN r $$) as (r agtype); r ----------------------------------------------------------------------------------------------------------------------------------------------------------------- {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r {years:3}]-() MATCH ()-[r {relationship: "friends"}]-() RETURN r $$) as (r agtype); r ----------------------------------------------------------------------------------------------------------------------------------------------------------------- {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge (4 rows) --mismatch year #, should return nothing SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r {years:2}]-() MATCH ()-[r {relationship: "friends"}]-() RETURN r $$) as (r agtype); r --- (0 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r {relationship:"enemies"}]-() MATCH ()-[r {years:4}]-() RETURN r $$) as (r agtype); r ----------------------------------------------------------------------------------------------------------------------------------------------------------------- {"id": 4785074604081154, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710659, "properties": {"years": 4, "relationship": "enemies"}}::edge {"id": 4785074604081154, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710659, "properties": {"years": 4, "relationship": "enemies"}}::edge {"id": 4785074604081154, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710659, "properties": {"years": 4, "relationship": "enemies"}}::edge {"id": 4785074604081154, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710659, "properties": {"years": 4, "relationship": "enemies"}}::edge (4 rows) SELECT * FROM cypher('cypher_match', $$ MATCH ()-[r {relationship:"enemies"}]-() MATCH ()-[r {relationship:"friends"}]-() RETURN r $$) as (r agtype); r --- (0 rows) -- check reuse within clause - vertices SELECT * FROM cypher('cypher_match', $$ CREATE (u {name: "Dave"})-[:knows]->({name: "John"})-[:knows]->(u) RETURN u $$) as (u agtype); u ------------------------------------------------------------------------------ {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH p=(u)-[]-()-[]-(u) RETURN p $$)as (p agtype); p ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex, {"id": 4785074604081155, "label": "knows", "end_id": 281474976710667, "start_id": 281474976710668, "properties": {}}::edge, {"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex, {"id": 4785074604081156, "label": "knows", "end_id": 281474976710668, "start_id": 281474976710667, "properties": {}}::edge, {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex]::path [{"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex, {"id": 4785074604081155, "label": "knows", "end_id": 281474976710667, "start_id": 281474976710668, "properties": {}}::edge, {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex, {"id": 4785074604081156, "label": "knows", "end_id": 281474976710668, "start_id": 281474976710667, "properties": {}}::edge, {"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex]::path [{"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex, {"id": 4785074604081156, "label": "knows", "end_id": 281474976710668, "start_id": 281474976710667, "properties": {}}::edge, {"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex, {"id": 4785074604081155, "label": "knows", "end_id": 281474976710667, "start_id": 281474976710668, "properties": {}}::edge, {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex]::path [{"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex, {"id": 4785074604081156, "label": "knows", "end_id": 281474976710668, "start_id": 281474976710667, "properties": {}}::edge, {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex, {"id": 4785074604081155, "label": "knows", "end_id": 281474976710667, "start_id": 281474976710668, "properties": {}}::edge, {"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex]::path (4 rows) SELECT * FROM cypher('cypher_match', $$ MATCH p=(u)-[]->()-[]->(u) RETURN p $$)as (p agtype); p ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex, {"id": 4785074604081155, "label": "knows", "end_id": 281474976710667, "start_id": 281474976710668, "properties": {}}::edge, {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex, {"id": 4785074604081156, "label": "knows", "end_id": 281474976710668, "start_id": 281474976710667, "properties": {}}::edge, {"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex]::path [{"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex, {"id": 4785074604081156, "label": "knows", "end_id": 281474976710668, "start_id": 281474976710667, "properties": {}}::edge, {"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex, {"id": 4785074604081155, "label": "knows", "end_id": 281474976710667, "start_id": 281474976710668, "properties": {}}::edge, {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex]::path (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH p=(a)-[]->()-[]->(a {name: "Dave"}) RETURN p $$)as (p agtype); p ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex, {"id": 4785074604081156, "label": "knows", "end_id": 281474976710668, "start_id": 281474976710667, "properties": {}}::edge, {"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex, {"id": 4785074604081155, "label": "knows", "end_id": 281474976710667, "start_id": 281474976710668, "properties": {}}::edge, {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex]::path (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH p=(a)-[]->()-[]->(a {name: "John"}) RETURN p $$)as (p agtype); p ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex, {"id": 4785074604081155, "label": "knows", "end_id": 281474976710667, "start_id": 281474976710668, "properties": {}}::edge, {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex, {"id": 4785074604081156, "label": "knows", "end_id": 281474976710668, "start_id": 281474976710667, "properties": {}}::edge, {"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex]::path (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH p=(a {name: "Dave"})-[]->()-[]->(a {name: "Dave"}) RETURN p $$)as (p agtype); p ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex, {"id": 4785074604081156, "label": "knows", "end_id": 281474976710668, "start_id": 281474976710667, "properties": {}}::edge, {"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex, {"id": 4785074604081155, "label": "knows", "end_id": 281474976710667, "start_id": 281474976710668, "properties": {}}::edge, {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex]::path (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH p=(a {name: "John"})-[]->()-[]->(a {name: "John"}) RETURN p $$)as (p agtype); p ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex, {"id": 4785074604081155, "label": "knows", "end_id": 281474976710667, "start_id": 281474976710668, "properties": {}}::edge, {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex, {"id": 4785074604081156, "label": "knows", "end_id": 281474976710668, "start_id": 281474976710667, "properties": {}}::edge, {"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex]::path (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH p=(a {name: "Dave"})-[]->()-[]->(a) RETURN p $$)as (p agtype); p ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex, {"id": 4785074604081156, "label": "knows", "end_id": 281474976710668, "start_id": 281474976710667, "properties": {}}::edge, {"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex, {"id": 4785074604081155, "label": "knows", "end_id": 281474976710667, "start_id": 281474976710668, "properties": {}}::edge, {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex]::path (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH p=(a {name: "John"})-[]->()-[]->(a) RETURN p $$)as (p agtype); p ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex, {"id": 4785074604081155, "label": "knows", "end_id": 281474976710667, "start_id": 281474976710668, "properties": {}}::edge, {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex, {"id": 4785074604081156, "label": "knows", "end_id": 281474976710668, "start_id": 281474976710667, "properties": {}}::edge, {"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex]::path (1 row) -- these are illegal and should fail SELECT * FROM cypher('cypher_match', $$ MATCH p=(a)-[b]->()-[b:knows]->(a) RETURN p $$)as (p agtype); ERROR: duplicate edge variable 'b' within a clause LINE 1: ...ROM cypher('cypher_match', $$ MATCH p=(a)-[b]->()-[b:knows]-... ^ SELECT * FROM cypher('cypher_match', $$ MATCH p=(a)-[b]->()-[b]->(a) RETURN p $$)as (p agtype); ERROR: duplicate edge variable 'b' within a clause LINE 1: ...ROM cypher('cypher_match', $$ MATCH p=(a)-[b]->()-[b]->(a) R... ^ SELECT * FROM cypher('cypher_match', $$ MATCH p=(a)-[b:knows]->()-[b:knows]->(a) RETURN p $$)as (p agtype); ERROR: duplicate edge variable 'b' within a clause LINE 1: ...pher('cypher_match', $$ MATCH p=(a)-[b:knows]->()-[b:knows]-... ^ SELECT * FROM cypher('cypher_match', $$ MATCH p=(a)-[b:knows]->()-[b]->(a) RETURN p $$)as (p agtype); ERROR: duplicate edge variable 'b' within a clause LINE 1: ...pher('cypher_match', $$ MATCH p=(a)-[b:knows]->()-[b]->(a) R... ^ SELECT * FROM cypher('cypher_match', $$ MATCH p=(p) RETURN p $$)as (p agtype); ERROR: variable "p" is for a path LINE 1: SELECT * FROM cypher('cypher_match', $$ MATCH p=(p) RETURN p... ^ SELECT * FROM cypher('cypher_match', $$ MATCH p=(p)-[]->() RETURN p $$)as (p agtype); ERROR: variable "p" is for a path LINE 1: SELECT * FROM cypher('cypher_match', $$ MATCH p=(p)-[]->() R... ^ SELECT * FROM cypher('cypher_match', $$ MATCH p=()-[p]->() RETURN p $$)as (p agtype); ERROR: variable "p" is for a path LINE 1: ...ELECT * FROM cypher('cypher_match', $$ MATCH p=()-[p]->() RE... ^ SELECT * FROM cypher('cypher_match', $$ MATCH p=() MATCH (p) RETURN p $$)as (p agtype); ERROR: variable 'p' already exists LINE 1: ... FROM cypher('cypher_match', $$ MATCH p=() MATCH (p) RETURN ... ^ SELECT * FROM cypher('cypher_match', $$ MATCH p=() MATCH (p)-[]->() RETURN p $$)as (p agtype); ERROR: variable 'p' already exists LINE 1: ... FROM cypher('cypher_match', $$ MATCH p=() MATCH (p)-[]->() ... ^ SELECT * FROM cypher('cypher_match', $$ MATCH p=() MATCH ()-[p]->() RETURN p $$)as (p agtype); ERROR: variable 'p' already exists LINE 1: ...ROM cypher('cypher_match', $$ MATCH p=() MATCH ()-[p]->() RE... ^ SELECT * FROM cypher('cypher_match', $$ MATCH (p) MATCH p=() RETURN p $$)as (p agtype); ERROR: variable "p" already exists LINE 1: ... * FROM cypher('cypher_match', $$ MATCH (p) MATCH p=() RETUR... ^ SELECT * FROM cypher('cypher_match', $$ MATCH ()-[p]->() MATCH p=() RETURN p $$)as (p agtype); ERROR: variable "p" already exists LINE 1: ... cypher('cypher_match', $$ MATCH ()-[p]->() MATCH p=() RETUR... ^ SELECT * FROM cypher('cypher_match', $$ MATCH ()-[p *]-()-[p]-() RETURN 0 $$)as (p agtype); ERROR: variable 'p' is for a VLE edge LINE 1: ... FROM cypher('cypher_match', $$ MATCH ()-[p *]-()-[p]-() RET... ^ SELECT * FROM cypher('cypher_match', $$ CREATE (p) WITH p MATCH p=() RETURN p $$)as (p agtype); ERROR: variable "p" already exists LINE 1: ...cypher('cypher_match', $$ CREATE (p) WITH p MATCH p=() RETUR... ^ SELECT * FROM cypher('cypher_match', $$ CREATE p=() WITH p MATCH (p) RETURN p $$)as (p agtype); ERROR: variable 'p' already exists LINE 1: ...pher('cypher_match', $$ CREATE p=() WITH p MATCH (p) RETURN ... ^ SELECT * FROM cypher('cypher_match', $$ CREATE ()-[p:knows]->() WITH p MATCH p=() RETURN p $$)as (p agtype); ERROR: variable "p" already exists LINE 1: ...r_match', $$ CREATE ()-[p:knows]->() WITH p MATCH p=() RETUR... ^ SELECT * FROM cypher('cypher_match', $$ CREATE p=() WITH p MATCH ()-[p]->() RETURN p $$)as (p agtype); ERROR: variable 'p' already exists LINE 1: ...er('cypher_match', $$ CREATE p=() WITH p MATCH ()-[p]->() RE... ^ -- -- Default alias check (issue #883) -- SELECT * FROM cypher('cypher_match', $$ MATCH (_) RETURN _ $$) as (a agtype); a ------------------------------------------------------------------------------------------ {"id": 281474976710662, "label": "", "properties": {"i": 1, "j": 2, "k": 3}}::vertex {"id": 281474976710663, "label": "", "properties": {"i": 1, "j": 3}}::vertex {"id": 281474976710664, "label": "", "properties": {"i": 2, "k": 3}}::vertex {"id": 281474976710665, "label": "", "properties": {"age": 4}}::vertex {"id": 281474976710666, "label": "", "properties": {"age": 6}}::vertex {"id": 281474976710660, "label": "", "properties": {"age": 4, "name": "F"}}::vertex {"id": 281474976710661, "label": "", "properties": {"age": 4, "name": "T"}}::vertex {"id": 281474976710659, "label": "", "properties": {"age": 3, "name": "orphan"}}::vertex {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex {"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex (10 rows) SELECT * FROM cypher('cypher_match', $$ MATCH () MATCH (_{name: "Dave"}) RETURN 0 $$) as (a agtype); a --- 0 (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH () MATCH (_{name: "Dave"}) RETURN _ $$) as (a agtype); a ------------------------------------------------------------------------------ {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH (my_age_default_{name: "Dave"}) RETURN my_age_default_$$) as (a agtype); a ------------------------------------------------------------------------------ {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex (1 row) SELECT * FROM cypher('cypher_match', $$ MATCH () MATCH (my_age_default_{name: "Dave"}) RETURN my_age_default_$$) as (a agtype); a ------------------------------------------------------------------------------ {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex (1 row) -- these should fail as they are prefixed with _age_default_ which is only for internal use SELECT * FROM cypher('cypher_match', $$ MATCH (_age_default_) RETURN _age_default_ $$) as (a agtype); ERROR: _age_default_ is only for internal use LINE 1: SELECT * FROM cypher('cypher_match', $$ MATCH (_age_default_... ^ SELECT * FROM cypher('cypher_match', $$ MATCH (_age_default_a) RETURN _age_default_a $$) as (a agtype); ERROR: _age_default_ is only for internal use LINE 1: SELECT * FROM cypher('cypher_match', $$ MATCH (_age_default_... ^ SELECT * FROM cypher('cypher_match', $$ MATCH (_age_default_whatever) RETURN 0 $$) as (a agtype); ERROR: _age_default_ is only for internal use LINE 1: SELECT * FROM cypher('cypher_match', $$ MATCH (_age_default_... ^ -- issue 876 SELECT * FROM cypher('cypher_match', $$ MATCH ({name: "Dave"}) MATCH ({name: "Dave"}) MATCH ({name: "Dave"}) RETURN 0 $$) as (a agtype); a --- 0 (1 row) SELECT * FROM cypher('cypher_match', $$MATCH ({n0:0}) MATCH ()-[]->() MATCH ({n1:0})-[]-() RETURN 0 AS n2$$) as (a agtype); a --- (0 rows) -- -- self referencing property constraints (issue #898) -- SELECT * FROM cypher('cypher_match', $$ MATCH (a {name:a.name}) RETURN a $$) as (a agtype); a ------------------------------------------------------------------------------------------ {"id": 281474976710660, "label": "", "properties": {"age": 4, "name": "F"}}::vertex {"id": 281474976710661, "label": "", "properties": {"age": 4, "name": "T"}}::vertex {"id": 281474976710659, "label": "", "properties": {"age": 3, "name": "orphan"}}::vertex {"id": 281474976710667, "label": "", "properties": {"name": "Dave"}}::vertex {"id": 281474976710668, "label": "", "properties": {"name": "John"}}::vertex (5 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (a {name:a.name, age:a.age}) RETURN a $$) as (a agtype); a ------------------------------------------------------------------------------------------ {"id": 281474976710660, "label": "", "properties": {"age": 4, "name": "F"}}::vertex {"id": 281474976710661, "label": "", "properties": {"age": 4, "name": "T"}}::vertex {"id": 281474976710659, "label": "", "properties": {"age": 3, "name": "orphan"}}::vertex (3 rows) SELECT * FROM cypher('cypher_match', $$ MATCH (a {name:a.name}) MATCH (a {age:a.age}) RETURN a $$) as (a agtype); a ------------------------------------------------------------------------------------------ {"id": 281474976710660, "label": "", "properties": {"age": 4, "name": "F"}}::vertex {"id": 281474976710661, "label": "", "properties": {"age": 4, "name": "T"}}::vertex {"id": 281474976710659, "label": "", "properties": {"age": 3, "name": "orphan"}}::vertex (3 rows) SELECT * FROM cypher('cypher_match', $$ MATCH p=(a)-[u {relationship: u.relationship}]->(b) RETURN p $$) as (a agtype); a ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 281474976710661, "label": "", "properties": {"age": 4, "name": "T"}}::vertex, {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge, {"id": 281474976710666, "label": "", "properties": {"age": 6}}::vertex]::path [{"id": 281474976710659, "label": "", "properties": {"age": 3, "name": "orphan"}}::vertex, {"id": 4785074604081154, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710659, "properties": {"years": 4, "relationship": "enemies"}}::edge, {"id": 281474976710666, "label": "", "properties": {"age": 6}}::vertex]::path (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH p=(a)-[u {relationship: u.relationship, years: u.years}]->(b) RETURN p $$) as (a agtype); a ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 281474976710661, "label": "", "properties": {"age": 4, "name": "T"}}::vertex, {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge, {"id": 281474976710666, "label": "", "properties": {"age": 6}}::vertex]::path [{"id": 281474976710659, "label": "", "properties": {"age": 3, "name": "orphan"}}::vertex, {"id": 4785074604081154, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710659, "properties": {"years": 4, "relationship": "enemies"}}::edge, {"id": 281474976710666, "label": "", "properties": {"age": 6}}::vertex]::path (2 rows) SELECT * FROM cypher('cypher_match', $$ MATCH p=(a {name:a.name})-[u {relationship: u.relationship}]->(b {age:b.age}) RETURN p $$) as (a agtype); a ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"id": 281474976710661, "label": "", "properties": {"age": 4, "name": "T"}}::vertex, {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710661, "properties": {"years": 3, "relationship": "friends"}}::edge, {"id": 281474976710666, "label": "", "properties": {"age": 6}}::vertex]::path [{"id": 281474976710659, "label": "", "properties": {"age": 3, "name": "orphan"}}::vertex, {"id": 4785074604081154, "label": "knows", "end_id": 281474976710666, "start_id": 281474976710659, "properties": {"years": 4, "relationship": "enemies"}}::edge, {"id": 281474976710666, "label": "", "properties": {"age": 6}}::vertex]::path (2 rows) SELECT * FROM cypher('cypher_match', $$ CREATE () WITH * MATCH (x{n0:x.n1}) RETURN 0 $$) as (a agtype); a --- (0 rows) -- these should fail due to multiple labels for a variable SELECT * FROM cypher('cypher_match', $$ MATCH p=(x)-[]->(x:R) RETURN p, x $$) AS (p agtype, x agtype); ERROR: multiple labels for variable 'x' are not supported LINE 1: ...* FROM cypher('cypher_match', $$ MATCH p=(x)-[]->(x:R) RETUR... ^ SELECT * FROM cypher('cypher_match', $$ MATCH p=(x:r)-[]->(x:R) RETURN p, x $$) AS (p agtype, x agtype); ERROR: multiple labels for variable 'x' are not supported LINE 1: ...FROM cypher('cypher_match', $$ MATCH p=(x:r)-[]->(x:R) RETUR... ^ -- -- Clean up -- SELECT drop_graph('cypher_match', true); NOTICE: drop cascades to 17 other objects DETAIL: drop cascades to table cypher_match._ag_label_vertex drop cascades to table cypher_match._ag_label_edge drop cascades to table cypher_match.v drop cascades to table cypher_match.v1 drop cascades to table cypher_match.e1 drop cascades to table cypher_match.v2 drop cascades to table cypher_match.e2 drop cascades to table cypher_match.v3 drop cascades to table cypher_match.e3 drop cascades to table cypher_match.loop drop cascades to table cypher_match.self drop cascades to table cypher_match.duplicate drop cascades to table cypher_match.dup_edge drop cascades to table cypher_match.other_v drop cascades to table cypher_match.opt_match_v drop cascades to table cypher_match.opt_match_e drop cascades to table cypher_match.knows NOTICE: graph "cypher_match" has been dropped drop_graph ------------ (1 row) SELECT drop_graph('test_retrieve_var', true); NOTICE: drop cascades to 5 other objects DETAIL: drop cascades to table test_retrieve_var._ag_label_vertex drop cascades to table test_retrieve_var._ag_label_edge drop cascades to table test_retrieve_var."A" drop cascades to table test_retrieve_var.incs drop cascades to table test_retrieve_var."C" NOTICE: graph "test_retrieve_var" has been dropped drop_graph ------------ (1 row) -- -- End --