Neo4j Cypher常用关键字在MyBatis XML中的使用示例

89 阅读3分钟

Neo4j Cypher 常用关键字详解

下面我将系统整理Neo4j Cypher查询语言中的常用关键字,包括基础查询、数据操作和高级功能,并提供MyBatis XML中的使用示例。

一、基础查询关键字

1. MATCH

用于指定图模式匹配。

<select id="findActorByName" resultType="Actor">
    MATCH (a:Actor {name: #{name}})
    RETURN a
</select>

2. WHERE

添加过滤条件。

<select id="findActorsBornAfter" resultType="Actor">
    MATCH (a:Actor)
    WHERE a.born > #{year}
    RETURN a
</select>

3. RETURN

定义返回结果。

<select id="findMovieTitles" resultType="string">
    MATCH (m:Movie)
    RETURN m.title
</select>

4. ORDER BY

结果排序。

<select id="findActorsOrderByBorn" resultType="Actor">
    MATCH (a:Actor)
    RETURN a
    ORDER BY a.born DESC
</select>

5. LIMIT / SKIP

分页控制。

<select id="findActorsPaginated" resultType="Actor">
    MATCH (a:Actor)
    RETURN a
    SKIP #{offset} LIMIT #{limit}
</select>

二、数据操作关键字

6. CREATE

创建节点和关系。

<insert id="createActor" parameterType="Actor">
    CREATE (a:Actor {name: #{name}, born: #{born}})
    RETURN id(a)
</insert>

7. MERGE

存在则匹配,不存在则创建。

<insert id="mergeActor">
    MERGE (a:Actor {name: #{name}})
    ON CREATE SET a.born = #{born}
    RETURN id(a)
</insert>

8. SET

更新属性。

<update id="updateActorBorn">
    MATCH (a:Actor)
    WHERE id(a) = #{id}
    SET a.born = #{born}
</update>

9. DELETE

删除节点或关系。

<delete id="deleteActor">
    MATCH (a:Actor)
    WHERE id(a) = #{id}
    DELETE a
</delete>

10. DETACH DELETE

删除节点及其所有关系。

<delete id="deleteActorWithRelationships">
    MATCH (a:Actor)
    WHERE id(a) = #{id}
    DETACH DELETE a
</delete>

三、高级查询关键字

11. WITH

将前一部分查询结果传递给下一部分。

<select id="findPopularActors" resultType="Actor">
    MATCH (a:Actor)-[:ACTED_IN]->(m:Movie)
    WITH a, count(m) AS movieCount
    WHERE movieCount > 5
    RETURN a
</select>

12. UNWIND

展开集合为多行。

<insert id="batchCreateMovies">
    UNWIND #{movies} AS movie
    CREATE (m:Movie {title: movie.title, released: movie.released}})
    RETURN id(m)
</insert>

13. DISTINCT

去除重复结果。

<select id="findUniqueDirectors" resultType="string">
    MATCH (d:Person)-[:DIRECTED]->(:Movie)
    RETURN DISTINCT d.name
</select>

14. COLLECT

将多行结果聚合为列表。

<select id="findActorWithMovies" resultType="map">
    MATCH (a:Actor)-[:ACTED_IN]->(m:Movie)
    WHERE id(a) = #{actorId}
    RETURN a.name AS actorName, collect(m.title) AS movies
</select>

15. AS

为结果指定别名。

<select id="findActorStats" resultType="map">
    MATCH (a:Actor)-[:ACTED_IN]->(m:Movie)
    RETURN 
        a.name AS name,
        count(m) AS movieCount,
        avg(m.rating) AS avgRating
</select>

四、关系操作关键字

16. -[...]-> / <-[...]-

表示关系方向。

<select id="findCoActors" resultType="Actor">
    MATCH (a1:Actor)-[:ACTED_IN]->()<-[:ACTED_IN]-(a2:Actor)
    WHERE id(a1) = #{actorId}
    RETURN DISTINCT a2
</select>

17. [...]-

无方向关系。

<select id="findRelatedPeople" resultType="Person">
    MATCH (p1:Person)-[:KNOWS]-(p2:Person)
    WHERE id(p1) = #{personId}
    RETURN p2
</select>

五、函数和聚合

18. count()

计数。

<select id="countActors" resultType="long">
    MATCH (a:Actor)
    RETURN count(a)
</select>

19. sum()/avg()/max()/min()

聚合函数。

<select id="getMovieStats" resultType="map">
    MATCH (m:Movie)
    RETURN 
        avg(m.rating) AS avgRating,
        max(m.released) AS latestYear
</select>

20. size()

获取集合大小。

<select id="getActorMovieCount" resultType="int">
    MATCH (a:Actor)-[:ACTED_IN]->(m:Movie)
    WHERE id(a) = #{actorId}
    RETURN size(collect(m))
</select>

六、模式匹配关键字

21. OPTIONAL MATCH

可选匹配(类似SQL左连接)。

<select id="findActorWithOptionalMovies" resultType="map">
    MATCH (a:Actor)
    OPTIONAL MATCH (a)-[:ACTED_IN]->(m:Movie)
    RETURN a, collect(m) AS movies
</select>

22. ... WHERE EXISTS {...}

存在性检查。

<select id="findActorsInHighRatedMovies" resultType="Actor">
    MATCH (a:Actor)
    WHERE EXISTS {
        MATCH (a)-[:ACTED_IN]->(m:Movie)
        WHERE m.rating > 8.0
    }
    RETURN a
</select>

七、索引和约束

23. CREATE INDEX

创建索引(通常在初始化时执行)。

<update id="createActorNameIndex">
    CREATE INDEX FOR (a:Actor) ON (a.name)
</update>

24. CREATE CONSTRAINT

创建约束。

<update id="createUniqueMovieTitleConstraint">
    CREATE CONSTRAINT ON (m:Movie) ASSERT m.title IS UNIQUE
</update>

MyBatis XML中使用注意事项

  1. 参数引用:使用#{param}语法
  2. 动态SQL:可以使用<if>, <choose>, <foreach>
  3. 特殊字符:使用<![CDATA[ ]]>包裹包含特殊字符的查询
  4. 结果映射
    • 简单类型:直接使用resultType
    • 复杂类型:定义resultMap或返回Map
<select id="complexQuery" resultType="map">
    <![CDATA[
    MATCH (a:Actor)-[:ACTED_IN]->(m:Movie)
    WHERE a.born > #{minBorn} AND m.rating > #{minRating}
    WITH a, collect(m) AS movies
    WHERE size(movies) > #{minMovies}
    RETURN a.name AS actorName, movies
    ]]>
</select>

这些关键字覆盖了Neo4j Cypher 90%的日常使用场景,掌握后可以应对大多数图数据库查询需求。在实际应用中,可以根据业务需求组合这些关键字构建复杂的查询逻辑。