logo

Cypher

Cypher

Cypher의 특징

  • 그래프 패턴을 직관적으로 표현: 노드와 관계를 그림처럼 표현
  • SQL보다 관계 탐색이 자연스러움
  • 노드와 관계가 속성을 가질 수 있음(Labeled Property Graph 모델)
  • 경로 탐색에 강함

GraphQLite

!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; # 제품의 이름
Previous
RDF