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中使用注意事项
- 参数引用:使用
#{param}语法 - 动态SQL:可以使用
<if>,<choose>,<foreach>等 - 特殊字符:使用
<![CDATA[ ]]>包裹包含特殊字符的查询 - 结果映射:
- 简单类型:直接使用
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%的日常使用场景,掌握后可以应对大多数图数据库查询需求。在实际应用中,可以根据业务需求组合这些关键字构建复杂的查询逻辑。