Cypher
Cypher
Cypher의 특징
- 그래프 패턴을 직관적으로 표현: 노드와 관계를 그림처럼 표현
- SQL보다 관계 탐색이 자연스러움
- 노드와 관계가 속성을 가질 수 있음(Labeled Property Graph 모델)
- 경로 탐색에 강함
GraphQLite
-
SQLite에서 Cypher를 일부 사용할 수 있도록 확장
-
간단한 용도에 적합
-
Python과 연동도 간단
-
설치
!pip install graphqlite
- 임포트
import graphqlite
그래프 만들기
- 메모리에 만들기
cg = graphqlite.Graph(':memory:')
- sqlite 파일로 만들기
cg = graphqlite.Graph('business.db')
파일 내용을 DB에 쓰기
with open("business.cypher") as f:
cypher_script = f.read()
for stmt in cypher_script.split(";"):
if stmt.strip():
cg.query(stmt)
고객을 모두 찾기
cg.query('''
MATCH (customer:Customer)
RETURN customer;
''')
Alice가 구입한 제품
- Alice가 구입한 제품
MATCH (:Customer {id: 'alice'})-[:BOUGHT]->(product:Product)
RETURN product;
- Alice가 구입한 제품의 카테고리
MATCH (:Customer {id: 'alice'}) -[:BOUGHT]-> (product:Product)
-[:BELONGS_TO]-> (category:Category)
RETURN
product.name AS productName,
category.name AS categoryName;
가격이 300 이상인 제품을 구입한 고객
MATCH (customer:Customer)-[:BOUGHT]->(product:Product)
WHERE product.price >= 300
RETURN
customer.name AS customerName,
product.name AS productName,
product.price AS price
Laptop에서 1~3 다리 건너 연결된 노드
MATCH (p:Product {name: 'Laptop'})-[*1..3]-(n)
RETURN n;
- SPARQL로는 구현이 까다로움
추천
MATCH (c:Customer {name: 'Alice'}) -[:BOUGHT]-> (p:Product) # Alice가 구입한 제품
-[:FREQUENTLY_BOUGHT_WITH]-> (rec:Product) # ..과 자주 같이 구입되지만
WHERE NOT (c)-[:BOUGHT]->(rec) # Alice가 구입하지 않은
RETURN DISTINCT rec.name; # 제품의 이름