如何用Java Cypher-DSL生成含模式理解的Neo4j查询?
使用Cypher-DSL生成指定Neo4j查询的实现方案
原始目标Cypher查询
MATCH (m:Movie) WHERE m.name = "star" RETURN DISTINCT m, [(m)<-[:HAS_RELATION]-(n:AnotherNode) | n] as othersnodes
对应的Java代码实现
以下是用Cypher-DSL生成上述查询的代码,核心通过listOf方法实现列表推导逻辑:
import org.neo4j.cypherdsl.core.Cypher; import org.neo4j.cypherdsl.core.Node; import org.neo4j.cypherdsl.core.Relationship; public class CypherDslDemo { public static void main(String[] args) { // 定义查询所需节点 Node movieNode = Cypher.node("Movie").named("m"); Node anotherNode = Cypher.node("AnotherNode").named("n"); // 定义关系:对应原始查询中(m)<-[:HAS_RELATION]-(n)的反向关联 Relationship hasRelation = anotherNode.relationshipTo(movieNode, "HAS_RELATION"); // 构建完整查询 var query = Cypher.match(movieNode) .where(movieNode.property("name").isEqualTo(Cypher.literalOf("star"))) .returning( movieNode.distinct(), // 实现RETURN DISTINCT m Cypher.listOf(hasRelation).returning(anotherNode).as("othersnodes") // 生成列表推导式 ) .build(); // 输出生成的Cypher语句 System.out.println(query.getCypher()); } }
代码与原始查询的对应说明
Cypher.match(movieNode)对应原始查询的MATCH (m:Movie)where(movieNode.property("name").isEqualTo(Cypher.literalOf("star")))实现WHERE m.name = "star"的条件过滤movieNode.distinct()生成RETURN DISTINCT m的去重返回逻辑Cypher.listOf(hasRelation).returning(anotherNode).as("othersnodes")对应列表推导式:listOf创建列表推导容器,传入的关系hasRelation描述节点关联方向,returning(anotherNode)指定列表元素为n节点,as设置别名。
内容的提问来源于stack exchange,提问作者Tech Gun
相关产品推荐
相关产品推荐

