5. Nội dung nghiên cứu
1.2.3. Ngôn ngữ truy vấn Cypher
1.2.3.1. Tổng quan về Cypher
Theo [4], Cypher là một ngôn ngữ khai báo truy vấn đồ thị cho phép truy vấn, cập nhật và quản trị đồ thị một cách rõ ràng và hiệu quả. Nó đƣợc thiết kế để phù hợp cho cả nhà phát triển và các chuy n gia. Cypher đƣợc thiết kế đơn giản nhƣng mạnh mẽ; Các truy vấn cơ sở dữ liệu phức tạp cao có thể đƣợc thể hiện dễ dàng, cho phép bạn tập trung vào vấn đề của mình, thay vì bị mất thời gian vào quyền truy cập cơ sở dữ liệu.
Về cấu trúc, Cypher mƣợn cấu trúc của nó từ SQL - các truy vấn đƣợc xây dựng bằng cách sử dụng các mệnh đề khác nhau. Các mệnh đề đƣợc liên kết với nhau và chúng cung cấp các tập kết quả trung gian giữa nhau.
1.2.3.2. Thực thi truy vấn Cypher
Có một số cách có thể thực hiện các truy vấn Cypher. Neo4j đi kèm với một số công cụ hỗ trợ thực thi Cypher và Cypher cũng có thể đƣợc thực thi từ mã Python, giống nhƣ SQL. Bảng 1.4 cho thấy các tùy chọn thực thi Cypher.
Bảng 1. 5. Công cụ và kỹ thuật đ thực hi n các truy vấn Cypher
Tool Description
Neo4j Shell Công cụ dòng lệnh
Neo4j Web Admin Console Giao diện dựa trên web
Python Theo chƣơng trình
REST Trên HTTP sử dụng giao diện REST
1.2.3.3. Các lệnh cơ bản trong Cypher
Đọc thêm tài liệu về các câu lệnh Cypher tại:
https://neo4j.com/docs/cypher-manual/current/clauses/
a. MATCH và RETURN
Ví dụ: Hiển thị User có id là ‗User 1‘
Mã lệnh Cypher:
MATCH (u:User {id:'User 1'}) RETURN u
b. CREATE với Cypher
Ví dụ: Tạo một node có nhãn (label) User với property {id: „User 944‟}
Mã lệnh Cypher:
CREATE (u: User {id: ‘User 944’}) RETURN u
c. UPDATE với Cypher
Mã lệnh Cypher:
MATCH (p: Person {name: ‚Jennifer‛}) SET p.birthday = date(‚1999-01-01‛)
Ví dụ 2: Jennifer làm việc ở công ty "Neo4j" từ năm 2018
Mã lệnh Cypher:
MATCH (:Person {name: ‚Jennifer‛})
-[rel:WORK_FOR]->(:Company {name: ‚Neo4j‛) SET rel.start_year = date({year:2018})
d. DELETE với Cypher
Ví dụ 1: Xóa mối quan hệ bạn bè giữa Jennifer và Mark
Mã lệnh Cypher:
MATCH (j: Person {name: ‚Jennifer‛})
-[friend: IS_FRIEND_WITH]->(m: Person {name: ‚Mark‛}) DELETE friend
Ví dụ 2: Xóa nút Person có property {name: "Mark"}
Mã lệnh Cypher:
MATCH (p: Person {name: ‚Mark‛) DELETE p
Ví dụ 3: Xóa đồng thời nút và mối quan hệ của nó
Mã lệnh Cypher:
MATCH (p: Person {name: ‚Mark‛}) DETACH DELETE p
e. REMOVE với Cypher
Xóa hoàn toàn thuộc tính khỏi nút và không lƣu trữ nó nữa.
Ví dụ: Xóa thuộc tính birthday của Jennifer
Mã lệnh Cypher:
REMOVE p.birthday
f. MERGE trong Cypher
MERGE thực hiện chọn lọc và kiểm tra dữ liệu có tồn tại trong CSDL hay không, trƣớc khi chèn vào CSDL.
Ví dụ 1: Chèn Person Mark vào CSDL bằng MERGE
Mã lệnh Cypher:
MERGE (mark: Person {name: ‚Mark‛}) RETURN mark
Nút mark đã tồn tại trong CSDL trƣớc đó, n n câu lệnh trên sẽ không tạo thêm nút mark mới mà chỉ trả về nút mark đã có.
MERGE trên 1 mối quan hệ: Sử dụng tƣơng tự nhƣ CREATE. Nếu mối quan hệ chƣa đƣợc thiết lập, MERGE sẽ thực hiện tạo mới toàn bộ (mặc dù nút đã tồn tại).
Ví dụ 2: Thực hiện tạo mối quan hệ bạn bè giữa Jennifer và Mark
Mã lệnh Cypher:
MATCH (j: Person {name: ‚Jennifer‛}) MATCH (m: Person {name: ‚Mark‛}) MERGE (j)-[r: IS_FRIEND_WITH]->(m) RETURN j, r, m
Sử dụng MATCH để thực hiện khớp dữ liệu trƣớc khi tạo mối quan hệ. Nếu chỉ sử dụng MERGE mà không khớp dữ liệu sẽ dẫn đến việc lệnh MERGE tạo lại các nút đã tạo nếu không tìm thấy mối quan hệ giữa các nút đó -> bị lặp dữ liệu.
g. Kết hợp MERGE, CREATE, MATCH và SET
đồng thời khởi tạo một số thuộc tính mới hoặc cập nhật lại các thuộc tính khác nếu nó chỉ đƣợc khớp, trong trƣờng hợp này, ta sử dụng ON CREATE hoặc ON MATCH với SET.
Mã lệnh Cypher:
MERGE (m: Person {name: ‚Mark‛})
-[r:IS_FRIEND_WITH]-(j: Person {name: ‚Jennifer‛}) ON CREATE SET r.since = date(‚2018-01-01‛)
ON MATCH SET r.update = date()
h. WHERE trong Cypher
Mã lệnh Cypher với WHERE:
MATCH (person: Person)
WHERE person.name = ‚Jennifer‛ RETURN person
• WHERE NOT: trả về thuộc tính không khớp với mẫu.
Mã lệnh Cypher:
MATCH (person: Person)
WHERE NOT person.name = ‚Jennifer‛ RETURN person
• WHERE EXISTS (property): kiểm tra xem thuộc tính có tồn tại trong nút hoặc một mối quan hệ có tồn tại trong mẫu.
Mã lệnh Cypher:
MATCH (varname: NodeLabel) WHERE exists(varname.property) RETURN varname
• WHERE ... IN: Kiểm tra xem giá trị thuộc tính có phải là giá trị trong danh sách đã cho.
Mã lệnh Cypher:
MATCH (varname: NodeLabel)
WHERE varname.property IN your_array RETURN varname