我一直试图遇到Neo4j的查询语言Cypher的查询构建器,理想情况下使用流畅的API.我没有找到太多,并决定花一些时间自己建一个.
到目前为止,结果是Cypher 1.9规范的流畅的API查询构建器.
在发布代码之前,我想使用StackOverflow开始讨论,看看有什么想法.
这是一个演示查询,您希望使用Cypher发送给Neo4j.
向我展示John知道谁知道谷歌软件工程师的所有人(Google公司代码假定为12345).John和将他连接到Google员工的人之间的关系强度至少应为3(假设范围为1-5).返回John的所有关系以及他们在Google上认识的人,包括这些人之间的关系.按约翰的连接名称按升序对结果进行排序,然后按关系强度按降序排序.
使用Fluent-Cypher:
Cypher
.on(Node.named("john").with(Index.named("PERSON_NAMES").match(Key.named("name").is("John"))))
.on(Node.named("google").with(Id.is(12345)))
.match(Connection.named("rel1").andType("KNOWS").between("john").and("middle"))
.match(Connection.named("rel2").andType("KNOWS").between("middle").and("googleEmployee"))
.match(Connection.withType("WORKS_AT").from("googleEmployee").to("google"))
.where(Are.allOfTheseTrue(Column.named("rel1.STRENGTH").isGreaterThanOrEqualTo(3)
.and(Column.named("googleEmployee.TITLE").isEqualTo("Software Engineer"))))
.returns(Columns.named("rel1", "middle", "rel2", "googleEmployee"))
.orderBy(Asc.column("middle.NAME"), Desc.column("rel1.STRENGTH"))
Run Code Online (Sandbox Code Playgroud)
这会产生以下查询:
START john=node:PERSON_NAMES(name='John'),google=node(12345) MATCH john-[rel1:KNOWS]-middle,middle-[rel2:KNOWS]-googleEmployee,googleEmployee-[:WORKS_AT]->google WHERE ((rel1.STRENGTH >= '3' AND googleEmployee.TITLE = 'Software Engineer')) RETURN rel1,middle,rel2,googleEmployee ORDER BY middle.NAME ASC,rel1.STRENGTH DESC
Run Code Online (Sandbox Code Playgroud)