blob: 1f10435ad2f27e8ebe192b04938774b3bd0790e2 [file] [log] [blame]
LOAD 'age';
SET search_path TO ag_catalog;
SELECT * FROM create_graph('subquery');
SELECT * FROM cypher('subquery', $$
CREATE (:person {name: "Briggite", age: 32})-[:knows]->(:person {name: "Takeshi", age: 28}),
(:person {name: "Chan", age: 45})<-[:knows]-(:person {name: "Faye", age: 25})-[:knows]->
(:person {name: "Tony", age: 34})-[:loved]->(:person {name : "Valerie", age: 33}),
(:person {name: "Calvin", age: 6})-[:knows]->(:pet {name: "Hobbes"}),
(:person {name: "Charlie", age: 8})-[:knows]->(:pet {name : "Snoopy"}),
(:pet {name: "Odie"})<-[:knows]-(:person {name: "Jon", age: 29})-[:knows]->(:pet {name: "Garfield"})
$$) AS (result agtype);
SELECT * FROM cypher('subquery', $$ MATCH (a) RETURN (a) $$) AS (result agtype);
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {(a:person)-[]->(:pet)}
RETURN (a) $$) AS (result agtype);
--trying to use b when not defined, should create pattern
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {(a:person)-[]->(b:pet)}
RETURN (a) $$) AS (result agtype);
--query inside
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {MATCH (a:person)-[]->(b:pet) RETURN b}
RETURN (a) $$) AS (result agtype);
--repeat variable in match
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {
MATCH (a:person)
WHERE a.name = 'Takeshi'
RETURN a
}
RETURN (a) $$) AS (result agtype);
--query inside, with WHERE
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {MATCH (a:person)-[]->(b:pet)
WHERE b.name = 'Briggite'
RETURN b}
RETURN (a) $$) AS (result agtype);
--no return
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {MATCH (a:person)-[]->(b:pet)
WHERE a.name = 'Calvin'}
RETURN (a) $$) AS (result agtype);
--union
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {
MATCH (a:person)-[]->(b:pet)
WHERE b.name = 'Hobbes'
RETURN b
UNION
MATCH (a:person)-[]->(c:person)
WHERE a.name = 'Faye'
RETURN c
}
RETURN (a) $$) AS (result agtype);
-- union, mismatched var, should fail
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {
MATCH (a:person)-[]->(b:pet)
WHERE b.name = 'Snoopy'
RETURN c
UNION
MATCH (c:person)-[]->(d:person)
RETURN c
}
RETURN (a) $$) AS (result agtype);
--union, no returns, not yet implemented, should error out
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {
MATCH (a:person)-[]->(b:pet)
WHERE a.name = 'Charlie'
UNION
MATCH (c:person)-[]->(d:person)
}
RETURN (a) $$) AS (result agtype);
--union, only one has return, should fail
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {
MATCH (a:person)-[]->(b:pet)
WHERE a.name = 'Faye'
RETURN a
UNION
MATCH (c:person)-[]->(d:person)
}
RETURN (a) $$) AS (result agtype);
--nesting (should return everything since a isn't sent all the way down)
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {
MATCH (b:person)
WHERE EXISTS {
MATCH (c:person)
WHERE c.name = 'Takeshi'
RETURN c
}
RETURN b
}
RETURN (a) $$) AS (result agtype);
--nesting same var multiple layers
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {
MATCH (a:person)
WHERE EXISTS {
MATCH (a:person)
WHERE a.name = 'Takeshi'
}
}
RETURN (a) $$) AS (result agtype);
--nesting, accessing var in outer scope
SELECT * FROM cypher('subquery', $$ MATCH (a)
WHERE EXISTS {
MATCH (b)
WHERE EXISTS {
MATCH (c:person)
WHERE b = c
}
}
RETURN (a) $$) AS (result agtype);
--nesting, accessing indirection in outer scope
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {
MATCH (b:person)
WHERE EXISTS {
MATCH (c:person)
WHERE b.name = 'Takeshi'
RETURN c
}
}
RETURN (a) $$) AS (result agtype);
--nesting, accessing var 2+ levels up
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {
MATCH (b:person)
WHERE EXISTS {
MATCH (a:person)
WHERE a.name = 'Takeshi'
RETURN a
}
}
RETURN (a) $$) AS (result agtype);
--nesting, accessing indirection 2+ levels up
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {
MATCH (b:person)
WHERE EXISTS {
MATCH (a:person)
WHERE a = b
RETURN a
}
}
RETURN (a) $$) AS (result agtype);
--EXISTS outside of WHERE
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
RETURN a, EXISTS {(a:person)-[]->(:pet)}
$$) AS (a agtype, exists agtype);
--Var doesnt exist in outside scope, should fail
SELECT * FROM cypher('subquery', $$ RETURN 1,
EXISTS {
MATCH (b:person)-[]->(:pet)
RETURN a
}
$$) AS (a agtype, exists agtype);
--- COUNT
--count pattern subquery in where
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE COUNT {(a:person)} > 1
RETURN (a) $$) AS (result agtype);
--count pattern in return
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
RETURN COUNT{(a)-[]->(:pet)} $$) AS (result agtype);
--count pattern with WHERE
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
RETURN COUNT{(a)-[]->(b:pet)
WHERE b.name = 'Hobbes'}
$$) AS (result agtype);
--solo match in where
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE COUNT{MATCH (a:person)-[]-()} > 1
RETURN a $$) AS (result agtype);
--match where person has more than one pet
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE COUNT{MATCH (a:person)-[]-(:pet)} > 1
RETURN a $$) AS (result agtype);
--match on labels
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE COUNT{MATCH (a:person)-[:knows]-()} > 1
RETURN a $$) AS (result agtype);
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE COUNT{MATCH (a:person)-[:knows]-(:pet)} > 1
RETURN a $$) AS (result agtype);
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE COUNT{MATCH (a:person)-[:knows]-(:person)} > 1
RETURN a $$) AS (result agtype);
--solo match in return
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
RETURN COUNT{MATCH (a)} $$) AS (result agtype);
--match return in where
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE COUNT{MATCH (a) RETURN a} > 1 RETURN a $$) AS (result agtype);
--match return in return with return
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
RETURN COUNT{MATCH (a) RETURN a} $$) AS (result agtype);
--match where return
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
RETURN a.name, a.age, COUNT{MATCH (a)
WHERE a.age > 25
RETURN a.name} $$)
AS (person agtype, age agtype, count agtype);
--counting number of relationships per node
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
RETURN a.name, COUNT{(a)-[]-()} $$) AS (name agtype, count agtype);
--nested counts
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
RETURN a.name, COUNT{MATCH (a)
WHERE COUNT {MATCH (a)
WHERE a.age < 23
RETURN a } > 0 } $$)
AS (name agtype, count agtype);
--incorrect variable reference
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
RETURN a.name, COUNT{MATCH (a) RETURN b} $$)
AS (name agtype, count agtype);
--incorrect nested variable reference
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
RETURN a.name, COUNT{MATCH (a)
WHERE COUNT {MATCH (b) RETURN b } > 1
RETURN b} $$)
AS (name agtype, count agtype);
--count nested with exists
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
RETURN a.name,
COUNT{MATCH (a) WHERE EXISTS {MATCH (a)-[]-(:pet)
RETURN a }} $$)
AS (name agtype, count agtype);
--
-- expression tree walker additional tests. want to test the nesting capabilties of the expr tree walker
--
--BoolExpr
-- with comparison
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {(a:person)-[]->(:pet)}
AND a.name = 'Odie'
RETURN (a) $$) AS (result agtype);
-- BoolExpr two subqueries
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {(a:person)-[]->(:pet)}
OR EXISTS {(a:person)-[]->(:person)}
RETURN (a) $$) AS (result agtype);
-- Nested BoolExpr
SELECT * FROM cypher('subquery', $$ MATCH (a:person)
WHERE EXISTS {(a:person)-[]->(:pet)
WHERE a.name = 'Charlie'}
AND EXISTS {(a:person)-[]->(:person)}
RETURN (a) $$) AS (result agtype);
-- CaseExpr
-- subqueries in WHEN statement in RETURN
SELECT * FROM cypher('subquery', $$ MATCH (a:person)-[]->(b)
RETURN
a.name,
b.name,
CASE
WHEN EXISTS { MATCH (a)-[:loved]->(b) } THEN "There is LOVE!!!!!!"
WHEN EXISTS { MATCH (a)-[:knows]->(b) } THEN "There is a relationship"
ELSE "No relation"
END $$) AS (a agtype, b agtype, c agtype);
-- subqueries in THEN, WHERE
SELECT * FROM cypher('subquery', $$ MATCH (a:person)-[]->(b)
WHERE
CASE a.name
WHEN "Jon" THEN EXISTS { MATCH (a)-[:knows]->(b) }
WHEN "Tony" THEN EXISTS { MATCH (a)-[:loved]->(b) }
ELSE False
END = true RETURN a $$) AS (result agtype);
-- nested in another exists
SELECT * FROM cypher('subquery', $$ MATCH (a:person)-[]->(b)
WHERE
EXISTS { MATCH (a) WHERE CASE a.name
WHEN "Jon" THEN EXISTS { MATCH (a)-[:knows]->(b) }
WHEN "Tony" THEN EXISTS { MATCH (a)-[:loved]->(b) }
ELSE False}
END = true RETURN a $$) AS (result agtype);
-- CoalesceExpr
--coalesce, nested in where
SELECT * FROM cypher('subquery', $$ MATCH (a:person)-[]->(b)
WHERE COALESCE( EXISTS {MATCH (a)-[:knows]->(b)
WHERE COALESCE( EXISTS {MATCH (a)
WHERE a.name = "Calvin"
OR a.name = "Charlie"})})
RETURN a $$) AS (result agtype);
--coalesce, nested in return
SELECT * FROM cypher('subquery', $$ MATCH (a:person)-[]->(b)
RETURN COALESCE( EXISTS {MATCH (a)-[:knows]->(b)
WHERE COALESCE( EXISTS {MATCH (a)
WHERE a.name = "Calvin"
OR a.name = "Charlie"})}) AS coalescefunc
$$) AS (name agtype, result agtype);
-- maps
--nested exists maps
SELECT * FROM cypher('subquery', $$MATCH (a)
WHERE {cond : true} = { cond : EXISTS {(a)
WHERE {age: a.age } = {age: a.age > 22}}}
RETURN a $$ ) AS (a agtype);
--nested exists in return
SELECT * FROM cypher('subquery', $$MATCH (a)
RETURN a, {cond : true} = { cond : EXISTS {(a)
WHERE {age: a.age } = {age: a.age > 22}}}
$$ ) AS (a agtype, cond agtype);
-- map projection
--where
SELECT * FROM cypher('subquery', $$MATCH (a)
WITH { a : EXISTS {(a) WHERE a.name = 'Chan'}} as matchmap, a
WHERE true = matchmap.a
RETURN a $$ ) AS (a agtype);
--return
SELECT * FROM cypher('subquery', $$MATCH (a)
RETURN a.name,
{ a : EXISTS {(a) WHERE a.name = 'Chan'}} $$ ) AS (a agtype, cond agtype);
--lists
--list
SELECT * FROM cypher('subquery', $$ MATCH (a:pet) WHERE true IN [EXISTS {
MATCH (a) WHERE a.name = 'Hobbes' RETURN a}] RETURN a $$) AS (result agtype);
--nested in list
SELECT * FROM cypher('subquery', $$ MATCH (a:pet) WHERE [true] IN [[EXISTS {
MATCH (a) WHERE a.name = 'Hobbes' RETURN a}]] RETURN a $$) AS (result agtype);
--exist nested in list nested in list
SELECT * FROM cypher('subquery', $$ MATCH (a:pet) WHERE [true] IN [[EXISTS {
MATCH (a) WHERE EXISTS {MATCH (a)-[]-()} RETURN a}]] RETURN a $$) AS (result agtype);
--
-- Cleanup
--
SELECT * FROM drop_graph('subquery', true);
--
-- End of tests
--