. : 아무 문자 1개
* : 앞의 것이 0번 이상
.* : 아무 문자가 0개 이상
+ : 앞의 것이 1번 이상
^ : 시작
$ : 끝
[] : 이 중 한 글자
| : 또는
(a)-[:REL*1..3]->(b)
→ 관계를 최소 1홉~최대 3홉까지 따라가며 탐색한다.
MATCH p = shortestPath((a)-[:REL*]-(b))
→ 두 노드 사이의 가장 짧은 경로를 p에 저장한다.
[n IN nodes(p) | n.name]
→ 리스트 컴프리헨션으로 각 노드에서 원하는 속성만 뽑아 리스트로 만든다.
[r IN relationships(p) WHERE 조건 | r.time]
→ 조건에 맞는 요소만 골라 원하는 속성으로 리스트를 만든다.
all(n IN nodes(p) WHERE 조건)
→ 모든 요소가 조건을 만족하는지 확인한다. (any=하나라도, none=하나도 없으면)
OPTIONAL MATCH p = (a)-[:REL]->(b)
→ 패턴이 없어도 행을 유지하고 찾지 못한 값을 null로 남긴다.
p IS NOT NULL AS connected
→ 경로 존재 여부를 true/false 값으로 반환한다.
WHERE EXISTS { (a)-[:REL]-(b) }
→ 해당 관계나 패턴이 존재하는 경우만 남긴다.
WHERE NOT EXISTS { (a)-[:REL]-(b) }
→ 해당 관계나 패턴이 존재하지 않는 경우만 남긴다.
WITH x.name AS src, r.time AS t WHERE t <= 60
→ 필요한 값만 넘기면서 중간 결과를 조건으로 필터링한다.
WITH h, r ORDER BY r.time LIMIT 1
→ 중간 결과를 정렬해 일부만 남긴 뒤 다음 쿼리 단계로 넘긴다.