【发布时间】:2014-03-15 23:10:18
【问题描述】:
我一直在尝试使用 Neo4j 的查询语言 Cypher 的查询构建器,最好使用流畅的 API。我没有找到太多东西,并决定花一些时间自己建造一个。
目前的结果是针对 Cypher 1.9 规范的流畅 API 查询构建器。
在发布代码之前,我想使用 StackOverflow 开始讨论并了解想法。
这是一个您希望使用 Cypher 发送到 Neo4j 的演示查询。
告诉我约翰认识的所有认识 Google 软件工程师的人(Google 公司代码假定为 12345)。 John 与将他与 Google 员工联系起来的人之间的关系强度至少应为 3(假设范围为 1-5)。 返回 John 的所有联系人以及他们在 Google 认识的人,包括这些人之间的关系。 按 John 的连接名称升序排列结果,然后按关系强度降序排列。
使用 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"))
产生以下查询:
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
【问题讨论】:
-
这里有什么问题?
-
这更像是一个开放式问题,旨在接收有关流畅密码 API 的反馈和建议。
-
你见过(Java版)github.com/neo4j/cypher-dsl
-
我喜欢你的 DSL,把它放在 github/maven/npm 上然后写博客怎么样?这将是收集反馈的最佳方式。 Neo4j 谷歌小组也可能更适合这类讨论。
-
dsl 与最新版本的 Neo4J 兼容
标签: neo4j cypher dsl fluent query-builder