You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:01:00