@neo4j/cypher-builder
Advanced tools
Changelog
1.13.0
#301 f2f679b
Thanks @angrykoala! - Add support for Collect subqueries:
const dog = new Cypher.Node({ labels: ["Dog"] });
const person = new Cypher.Node({ labels: ["Person"] });
const subquery = new Cypher.Match(
new Cypher.Pattern(person).related(new Cypher.Relationship({ type: "HAS_DOG" })).to(dog)
).return(dog.property("name"));
const match = new Cypher.Match(person)
.where(Cypher.in(new Cypher.Literal("Ozzy"), new Cypher.Collect(subquery)))
.return(person);
MATCH (this0:Person)
WHERE "Ozzy" IN COLLECT {
MATCH (this0:Person)-[this1:HAS_DOG]->(this2:Dog)
RETURN this2.name
}
RETURN this0
Changelog
1.12.0
#294 07280b6
Thanks @angrykoala! - Support for WHERE predicates in patters:
const movie = new Cypher.Node({ labels: ["Movie"] });
new Cypher.Pattern(movie).where(Cypher.eq(movie.property("title"), new Cypher.Literal("The Matrix")));
(this0:Movie WHERE this0.title = "The Matrix")
Changelog
1.11.0
#277 f97c229
Thanks @angrykoala! - Add support for type predicate expressions with the functions Cypher.isType
and Cypher.isNotType
:
const variable = new Cypher.Variable();
const unwindClause = new Cypher.Unwind([new Cypher.Literal([42, true, "abc", null]), variable]).return(
variable,
Cypher.isType(variable, Cypher.TYPE.INTEGER)
);
UNWIND [42, true, \\"abc\\", NULL] AS var0
RETURN var0, var0 IS :: INTEGER
#283 566e1d4
Thanks @angrykoala! - Prepends WITH on each UNION subquery when .importWith
is set in parent CALL:
const returnVar = new Cypher.Variable();
const n1 = new Cypher.Node({ labels: ["Movie"] });
const query1 = new Cypher.Match(n1).return([n1, returnVar]);
const n2 = new Cypher.Node({ labels: ["Movie"] });
const query2 = new Cypher.Match(n2).return([n2, returnVar]);
const unionQuery = new Cypher.Union(query1, query2);
const callQuery = new Cypher.Call(unionQuery).importWith(new Cypher.Variable());
The statement WITH var0
will be added to each UNION subquery
CALL {
WITH var0
MATCH (this1:Movie)
RETURN this1 AS var2
UNION
WITH var0
MATCH (this3:Movie)
RETURN this3 AS var2
}
#283 566e1d4
Thanks @angrykoala! - Deprecate Call.innerWith
in favor of Call.importWith
#289 b9a2ad6
Thanks @angrykoala! - Deprecates the second parameter of patternComprehensions in favor of new .map
method:
old
new Cypher.PatternComprehension(pattern, expr);
new
new Cypher.PatternComprehension(pattern).map(expr);
Changelog
1.10.3
#279 4620a2e
Thanks @angrykoala! - Add support for "*" parameter in MapProjection:
new Cypher.MapProjection(new Cypher.Variable(), "*");
var0 { .* }
Changelog
1.10.2
d154995
Thanks @MacondoExpress! - Fix a bug where the delete clause where not being attached to Cypher.Call
Changelog
1.10.1
#271 5834c61
Thanks @angrykoala! - Add labelOperator
option on build to change the default label AND
operator:
const node = new Cypher.Node({ labels: ["Movie", "Film"] });
const query = new Cypher.Match(node);
const queryResult = new TestClause(query).build(
undefined,
{},
{
labelOperator: "&",
}
);
Will return:
MATCH (this:Movie&Film)
Changelog
1.10.0
#269 6d9d3e2
Thanks @angrykoala! - Add chained clauses to Procedures after YIELD:
.unwind
.match
.optionalMatch
.delete
.detachDelete
.set
.merge
.create
.remove
Changelog
1.9.0
#263 4c4f49b
Thanks @angrykoala! - Support for NODETACH:
new Cypher.Match(n).noDetachDelete(n);
MATCH(n)
NODETACH DELETE n
#261 f018078
Thanks @angrykoala! - Add support for nullIf function Cypher.nullIf(expr1, expr2)
Changelog
1.8.0
#253 da0b3ab
Thanks @angrykoala! - Add support for type filtering on relationships
new Cypher.Match(new Cypher.Pattern().related(new Cypher.Relationship()).to()).where(
relationship.hasType("ACTED_IN")
);
MATCH(this0)-[this1]->(this2)
WHERE this1:ACTED_IN
#251 80e1bca
Thanks @angrykoala! - Add support for label expressions on hasLabel
:
const query = new Cypher.Match(node).where(node.hasLabel(Cypher.labelExpr.or("Movie", "Film")));
MATCH (this0:Movie)
WHERE this0:(Movie|Film)
#256 602c237
Thanks @angrykoala! - Add support for ON MATCH SET
after MERGE
:
const node = new Cypher.Node({
labels: ["MyLabel"],
});
const countProp = node.property("count");
const query = new Cypher.Merge(node)
.onCreateSet([countProp, new Cypher.Literal(1)])
.onMatchSet([countProp, Cypher.plus(countProp, new Cypher.Literal(1))]);
MERGE (this0:MyLabel)
ON MATCH SET
this0.count = (this0.count + 1)
ON CREATE SET
this0.count = 1
Changelog
1.7.4
#245 a63337d
Thanks @angrykoala! - Deprecate Merge.onCreate
in favor of Merge.onCreateSet
to better reflect the resulting Cypher ON CREATE SET
#244 347ae01
Thanks @angrykoala! - Fix clauses order when using Merge.onCreate
along with .set
For example:
const query = new Cypher.Merge(node)
.onCreate([node.property("age"), new Cypher.Param(23)])
.set([node.property("age"), new Cypher.Param(10)]);
MERGE (this0:MyLabel)
ON CREATE SET
this0.age = $param1
SET
this0.age = $param0