Welcome to MapleDSL Documentation¶
Purpose¶
Note
It inspired by cypher-dsl, But the difference is that maple-dsl focuses more on traversal-style and lambda-style on development.
The Maple-DSL has been developed with the needs of most graph database client(e.g. neo4j, nebula-graph-java, redisgraph, etc). We wanted to avoid string concatenations in our query generation and decided do go with a builder approach, much like we find with jOOQ or in the relational module of Spring Data JDBC.
Getting Started¶
Prepare dependencies¶
Inclusion of the Cypher-DSL in a Maven project
<dependency>
<groupId>io.github.maple-dsl</groupId>
<artifactId>maple-dsl-cypher</artifactId>
<version>1.0.3</version>
</dependency>
Inclusion of the Nebula-DSL in a Maven project
<dependency>
<groupId>io.github.maple-dsl</groupId>
<artifactId>maple-dsl-nebula</artifactId>
<version>1.0.3</version>
</dependency>
Examples¶
List all Tom Hanks movies released in the 1990s
constant
G.traverse(G.vertex("Person").eq("name", "Tom Hanks"))
.outE("ACTED_IN")
.outV("tomHanksMovies", "Movie", it -> it
.gte("released", 1990)
.lt("released", 2000)
.selectAs("released", "movie_released")
.selectAs("name", "movie_name"))
.render()
lambda function
@Label("Person") Person(String name) extends Model.V
@Label("Movie") Movie(String name, int released) extends Model.V
@Label("ACTED_IN") ActedIn(int type) extends Model.E
G.traverse(G.vertex(Person.class)
.eq(Person::getName, "Tom Hanks"))
.outE(ActedIn.class)
.outV("tomHanksMovies", Movie.class, it ->it
.gte(Movie::getReleased, 1990)
.lt(Movie::getReleased, 2000)
.selectAs(Movie::getName, "movie_name")
.selectAs(Movie::getReleased, "movie_released"))
.render()
MATCH (tom:`Person` {name: 'Tom Hanks'})-[:`ACTED_IN`]->(tomHanksMovies)
WHERE tomHanksMovies.released >= 1990 AND tomHanksMovies.released < 2000
RETURN tomHanksMovies.name as movie_name, tomHanksMovies.released as movie_released
LOOKUP ON `Person` WHERE Person.name == 'Tom Hanks' YIELD id(vertex) as _dst
| GO FROM $-._dst OVER ACTED_IN WHERE $$.Movie.released >= 1990 AND $$.Movie.released < 2000
YIELD $$.Movie.name as movie_name, $$.Movie.released as movie_released
via vertex ID
G.traverse("person_001")
.outE(ActedIn.class)
.outV("tomHanksMovies", Movie.class, it -> it
.gte(Movie::getReleased, 1990)
.lt(Movie::getReleased, 2000)
.selectAs(Movie::getName, "movie_name")
.selectAs(Movie::getReleased, "movie_released"))
.render()
MATCH (tom:`Person`)-[:`ACTED_IN`]->(tomHanksMovies)
WHERE id(tom) == 'person_001' AND tomHanksMovies.released >= 1990 AND tomHanksMovies.released < 2000
RETURN tomHanksMovies.name as movie_name, tomHanksMovies.released as movie_released
GO FROM "person_001" OVER ACTED_IN WHERE $$.Movie.released >= 1990 AND $$.Movie.released < 2000
YIELD $$.Movie.name as movie_name, $$.Movie.released as movie_released
List all Tom Hanks movies released in the 1990s, then find out the other person which acted together
G.traverse("person_001")
.outE(ActedIn.class)
.outV("tomHanksMovies", Movie.class, it ->it
.gte(Movie::getReleased, 1990)
.lt(Movie::getReleased, 2000)
.selectAs(Movie::getName, "movie_name")
.selectAs(Movie::getReleased, "movie_released"))
.inE(ActedIn.class)
.outV("other", Person.class, it -> it
.ne(Person::id, "person_001")
.selectAs(Person::getName, "actor_name"))
.render()
MATCH (tom:`Person`-[:`ACTED_IN`]->(tomHanksMovies)<-[:`ACTED_IN`]-(other:`Person`)
WHERE id(tom) == 'person_001' AND tomHanksMovies.released >= 1990 AND tomHanksMovies.released < 2000 AND id(other) != 'person_001'
RETURN tomHanksMovies.name as movie_name, tomHanksMovies.released as movie_released, others.name as actor_name
GO FROM "person_001" OVER ACTED_IN WHERE $$.Movie.released >= 1990 AND $$.Movie.released < 2000
YIELD id($$) AS _dst, $$.Movie.name AS movie_name, $$.Movie.released AS movie_released
| GO FROM $-._dst OVER ACTED_IN REVERSELY WHERE id($$) != 'person_001'
YIELD $$.Person.name AS actor_name, $-.movie_name AS movie_name, $-.movie_release AS movie_release