728x90
반응형
- 아래는 쿼리문이 아니라 표현식이다.
(:nodes)-[:ARE_CONNECTED_TO]->(:otherNodes)
- () 기호는 노드를 의미함
- -[]-> 는 노드 간의 관계를 의미함
- 각 노드와 관계에 대해 properties를 할당함
- 노드들은 특정 라벨에 의해 그룹화 될 수 있음
- 라벨은 테이블, 노드는 레코드라고 생각할 수 있음
노드 변수
- SQL의 Alias라고 생각하면 됨.
- 즉 쿼리에서의 변수 선언
- 노드 앞에 : 가 없다면 그 자체가 변수가 되어버림
- 이건 관계에서도 동일함
// 변수 없을 때
MATCH (:Person)
Return Person
// 변수 있을 때
MATCH (p:Person)
RETURN p
// 변수만 돌려줌
MATCH (Person)
RETURN Person
관계
- 관계는 언제나 화살표로 방향을 가지고 있음
- 방향이 선언되지 않은 경우 MATCH 구문을 사용함
- 방향이 특정되지 않았다는 것은, 어느 방향으로든 가능하다는 의미
- 아래 예시는 쿼리문이 아니라 설명임
// 오른쪽 방향 [p:Person]-[:LIKES]->(t:Technology)
// 왼쪽방향
[p:Person]<-[:LIKES]-(t:Technology)
// 방향 없을 때
(p:Person)-[:LIKES]-(t:Technology)
### 관계 타입
* 관계 타입은 자연어 처럼 노드들이 서로 관계하는지를 알려준다
* 관계 타입은 **관계들을 카테고리 화** 시킨다.
* 이는 라벨이 노드들을 하나로 묶는것과 비슷한 역할
* 또한 노드들이 서로 어떻게 관계하는지를 설명한다
```cypher
MATCH (p:Person)-[r:LIKES]->(t:Technology)
RETURN p,r,t
다양한 관계들
- 관계라는게 매개 테이블 처럼 생각하면 될 것 같다.
CREATE
(alice:Person {name:'Alice', age: 38, eyes: 'brown'}),
(bob:Person {name: 'Bob', age: 25, eyes: 'blue'}),
(charlie:Person {name: 'Charlie', age: 53, eyes: 'green'}),
(daniel:Person {name: 'Daniel', eyes: 'brown'}),
(eskil:Person {name: 'Eskil', age: 41, eyes: 'blue'}),
(alice)-[:KNOWS]->(bob),
(alice)-[:KNOWS]->(charlie),
(bob)-[:KNOWS]->(daniel),
(charlie)-[:KNOWS]->(daniel),
(bob)-[:MARRIED]->(eskil)
Properties
- 노드와 관계 모두에 추가될 수 있는 데이터 타입들
- properties는 {key: 'value'} 로 담는다
// 프로퍼티 생성
CREATE (p:Person {name:'Sally'})-[r:IS_FRIENDS_WITH]->(p:Person {name:'John'})
RETURN p, r
// 이건 쿼리가 아님
(p:Person {name: "Sally"})-[r:LIKES]->(g:Technology {type: "Graphs"})
쿼리문
// 생성
CREATE (p:Person {name: "Sally"})-[r:LIKES]->(t:Technology {type: "Graphs"})
// 조회
MATCH (p:Person {name: "Sally"})-[r:LIKES]->(t:Technology {type: "Graphs"})
RETURN p,r,t
// 조회
MATCH (p:Product)
RETURN p.productName, p.unitPrice
ORDER BY p.unitPrice DESC
LIMIT 10;
// WHERE 문 이용한 조회
MATCH (p:Product)
WHERE p.productName = 'Chocolade'
RETURN p.productName, p.unitPrice;
// properties 조회
MATCH (p:Product {productName:'Chocolade'})
RETURN p.productName, p.unitPrice;
// IN 이용한 조회
MATCH (p:Product)
WHERE p.productName IN ['Chocolade','Chai']
RETURN p.productName, p.unitPrice;
// LIKE 이용한 조회
MATCH (p:Product)
WHERE p.productName STARTS WITH 'C' AND p.unitPrice > 100
RETURN p.productName, p.unitPrice;
// 정규식을 이용한 조회
MATCH (p:Product)
WHERE p.productName =~ '^C.*'
RETURN p.productName, p.unitPrice
// JOIN 을 이용한 조회
MATCH (p:Product {productName:'Chocolade'})<-[:ORDERS]-(:Order)<-[:PURCHASED]-(c:Customer)
RETURN DISTINCT c.companyName;
OPTIONAL MATCH
- optional match는 OUTER JOIN 과 같음
MATCH (c:Customer {companyName:'Drachenblut Delikatessen'}) OPTIONAL MATCH (p:Product)<-[o:ORDERS]-(:Order)<-[:PURCHASED]-(c) RETURN p.productName, toInteger(sum(o.unitPrice * o.quantity)) AS volume ORDER BY volume DESC;
인덱싱
CREATE INDEX Product_productName IF NOT EXISTS FOR (p:Product) ON p.productName;
CREATE INDEX Product_unitPrice IF NOT EXISTS FOR (p:Product) ON p.unitPrice;
728x90
반응형
'백엔드 Backend > DB' 카테고리의 다른 글
[Neo4j] Neo4j Docker Compose로 구동시키기 (0) | 2024.12.10 |
---|---|
[GraphDB] Neo4J 란? (0) | 2024.12.03 |
[GraphDB] 그래프 데이터베이스란? (0) | 2024.12.02 |
[GraphDB] 그래프 데이터베이스 오픈소스 정리 (1) | 2024.11.29 |
[Ontology] PostgreSQL로 온톨로지 DB 구축 시 주의점 (1) | 2024.11.28 |