티스토리 뷰

Neo4j

Cypher - MATCH (2)

joyHong 2020. 6. 15. 23:53

이전 포스팅까지는 어쩌면 이번 포스팅을 위한 초석을 깔기 위해 진행된 것이라고 해도 무방할 것 같다.

MATCH 기능을 통해 다양한 종류를 살펴보기 위해서는 데이터가 필요한데 그러한 작업들을 이전 포스팅까지 해서 거의 다 생성하였으니 이제 다양한 매칭 종류에 대해서 살펴보도록 한다.

 

* 이전 포스팅의 쿼리들을 모두 수행하게 되면 이번 포스팅의 쿼리와 결과가 동일하게 나올 것입니다.

 

1. 여러 개의 property매칭

MATCH (n:Person{age:54, eyes:"brown"})
RETURN n.name

 

2. Propertyvalue 비교

MATCH (n:Person)
WHERE n.age>30
RETURN n.name, n.age

 

3. WHERE 절의 조건 연산자(OR, AND) 사용

MATCH (n:Person)-[:KNOWS]->(m:Person)
WHERE n.eyes="green" OR n.eyes="blue"
RETURN n.name, n.eyes

 

4. EXISTS , NOT EXISTS (존재 여부에 대한 결과 반환)

MATCH (n:Person)
WHERE NOT EXISTS(n.eyes) AND EXISTS(n.age)
RETURN n

 

5. 관계에 대한 EXISTS

MATCH (n:Person)
WHERE EXISTS( (n)-[:MARRIED]->() )
RETURN n

 

6. count

MATCH (n:Person)-[:KNOWS]->(m:Person)-[:EYES_COLOR]->(c:Color)
RETURN count(n)

 

7. STARTS WITH

MATCH (n:Person)
WHERE n.name STARTS WITH 'J'
RETURN n

 

8. List 포함 필터링 -  IN [ ]

MATCH (n:Person)
WHERE n.eyes IN ['blue', 'green']
RETURN n.name as name, n.eyes

* 레이블이 Person인 노드 n의 eyes 프로퍼티의 값이 리스트 [ ] 안의 요소 중 하나인지를 체크한다.

따라서 eyes의 값이 blue나 green인 노드가 결과로 반환된다.

 

9. List로 반환 – collect()

MATCH (n:Person)-[:KNOWS]->(m:Person)-[:EYES_COLOR]->(c:Color)
RETURN collect(n.name)

* collect( ) 는 여러 개의 결과를 리스트 형태로 만들어 결과로 반환한다.

 

10. 노드간의 거리로 매칭

MATCH  (n:Person)-[r:KNOWS*1]-(m)
WHERE n.name="Alice" 
RETURN n, m

* KNOWS 관계로 1번 연결된 것을 찾는 의미이다. *뒤의 숫자가 연결된 거리를 의미한다.

 

 

11. 노드간에 관계로 연결된 모든 노드 매칭

MATCH (n:Person)-[r:KNOWS*]->(m)
WHERE n.name="Alice" 
RETURN n, m

* 관계 뒤에 아스타리스크만 사용하게 되면 그 관계로 연결되는 모든 패스를 찾게 된다.

 

 

12. 노드간에 관계로 연결되는 거리가 1에서 2노드 매칭

MATCH (n:Person)-[r:KNOWS*1..2]-(m)
WHERE n.name="Alice" 
RETURN n, r, m

* 아스타리스크(*)뒤에 숫자..숫자는 거리의 제한을 의미한다.

 

 

13. 노드간에 관계로 연결되는 거리가 1에서 2노드 매칭하여 path를 반환

MATCH path = (n:Person)-[r:KNOWS*1..2]-(m)
WHERE n.name="Alice" 
RETURN path

* path를 결과로 반환할 수도 있다.

 

 

14. 최단거리, shortestPath ( )

MATCH path = shortestPath((n:Person)-[*]->(m))
WHERE n.name="Alice" AND m.name='Eskil'
RETURN path

 

 

15. 노드간에 관계로 연결되는 거리가 1에서 2노드 매칭하여 노드와 관계의 타입을 반환

MATCH path = (n:Person)-[r:KNOWS*1..2]-(m)
WHERE n.name="Alice" 
RETURN n, [rel in relationships(path) | type(rel)], m

 

 

16. OPTIONAL MATCH

MATCH path = (n:Person)-[r:KNOWS*1..2]-(m)
WHERE n.name="Alice" 
OPTIONAL MATCH (m)-[:MARRIED]-(l)
RETURN n, r, m, l

 

17. 정렬 ASC

MATCH path = (n:Person)-[r:KNOWS*1..2]-(m)
WHERE n.name="Alice" 
RETURN DISTINCT m.name, m.age
ORDER BY m.age

 

18. 정렬 DESC

MATCH path = (n:Person)-[r:KNOWS*1..2]-(m)
WHERE n.name="Alice" 
RETURN DISTINCT m.name, m.age
ORDER BY m.age DESC


19. SKIP

MATCH path = (n:Person)-[r:KNOWS*1..2]-(m)
WHERE n.name="Alice" 
RETURN DISTINCT m.name, m.age
ORDER BY m.age DESC
SKIP 2

* 일종의 offset과 같은 기능이다. 여기서는 처음 2개를 스킵하고 3번째부터 결과로 출력한다.

 

20. LIMIT

MATCH path = (n:Person)-[r:KNOWS*1..2]-(m)
WHERE n.name="Alice" 
RETURN DISTINCT m.name, m.age
ORDER BY m.age DESC
SKIP 2
LIMIT 3

 

21. ALL ( )

MATCH path = (n:Person)-[r:KNOWS*1..2]-(m)
WHERE n.name="Alice" AND ALL (x IN nodes(path) WHERE x.age > 30)
RETURN DISTINCT n.name, m.name, m.age

 

22. length ( )

MATCH path = (n:Person)-[r:KNOWS*1..2]-(m)
WHERE n.name="Alice" 
RETURN length(path)

 

23. nodes ( ) , relationships ( )

MATCH path = (n:Person)-[r:KNOWS*1..2]->(m)
WHERE EXISTS(n.age) 
RETURN nodes(path), relationships(path)

* path에 존재하는 노드 혹은 관계를 추출할 때 사용한다.

 

24. head ( ) , last ( )

MATCH path = (n:Person)-[r:KNOWS*1..2]->(m)
WHERE EXISTS(n.age) 
WITH nodes(path) as n_list
RETURN n_list, head(n_list).name, last(n_list).name

* 처음 혹은 마지막 노드를 추출하기 위해 사용한다.

 

 

25. head ( ) , last ( ) – list를 만들 때 name만 추출하여 생성

MATCH path = (n:Person)-[r:KNOWS*1..2]->(m)
WHERE EXISTS(n.age) 
WITH [nn in nodes(path) | nn.name] as n_list
RETURN n_list, head(n_list), last(n_list)

 

이상으로 다양한 매칭에 대해서 살펴보았다.

 


참조 :

https://neo4j.com/docs/cypher-manual/4.0/



'Neo4j' 카테고리의 다른 글

IMPORT CSV  (2) 2020.06.17
Cypher - INDEX & CONSTRAINT  (0) 2020.06.16
Cypher - MERGE  (1) 2020.06.15
Cypher - REMOVE & DELETE  (0) 2020.06.15
Cypher - SET & CREATE  (0) 2020.06.15
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함