Neo4j Cypher
Bài đăng này đã không được cập nhật trong 3 năm
1. Giới thiệu Cypher query language
Cypher là một ngôn ngữ truy vấn cơ sở dữ liệu đồ thị, với ngôn ngữ này chúng ta có thể tương tác như là truy vấn, cập nhập hay là quản trị một cách hiệu quả với cơ sở dữ liệu đồ thị. Ngôn ngữ này được thiết kế giúp cho develper cũng như là các chuyên gia có thể thuận tiện khi làm việc với neo4j. Cypher vốn được thiết kế đơn giản, tuy nhiên nó rất mạnh mẽ.
Cypher được lấy cảm hứng từ rất nhiều các cách tiếp cận khác nhau, một số các từ khóa như là WHERE, ORDER BY được lấy cảm hứng từ ngôn ngữ SQL, trong khi đó pattern matching thì lại được mượn từ SPARQL. Ngoài ra một vài ngữ nghĩa thì lại được mượn từ các ngôn ngữ khác như là Haskell và Python. Cấu trúc của Cypher được xây dựng dựa trên ngôn ngữ Tiếng Anh với ngữ nghĩa thuận tiện cho người thao tác với ngôn ngữ, điều này giúp cho việc viết và đọc các câu query cũng dễ dàng hơn.
Cấu trúc
Cypher có cấu trúc tương tự như SQL. Các câu query được xây dựng từ nhiều mệnh đề khác nhau. Các mệnh đề là chuỗi liên kết với nhau. Dưới đây sẽ là một vài ví dụ sử dụng mệnh đề để đọc dữ liệu từ CSDL đồ thị:
- MATH: so khớp với các pattern phù hợp. Đây là cách thông dụng nhất để lấy dữ liệu từ graph
- WHERE: không phải là một mệnh đề chính quy, nhưng nó là một phần của MATCH, OPTIONAL MATCH và WITH. WHERE sẽ thêm các ràng buộc vào pattern, hoặc sẽ fillter các kết quả có được thông qua WITH
- RETURN: trả về kết quả
Chúng ta sẽ hiểu hơn MATCH và RETURN thông qua ví dụ sau:
CREATE (john:Person {name: 'John'})
CREATE (joe:Person {name: 'Joe'})
CREATE (steve:Person {name: 'Steve'})
CREATE (sara:Person {name: 'Sara'})
CREATE (maria:Person {name: 'Maria'})
CREATE (john)-[:FRIEND]->(joe)-[:FRIEND]->(steve)
CREATE (john)-[:FRIEND]->(sara)-[:FRIEND]->(maria)
Hình phía dưới sẽ minh họa cho Graph mà chúng ta đã tạo:
Với Graph phía trên nếu muốn viết truy vấn để tìm ra user có tên là John và những người bạn của bạn anh ấy (có thể hiểu ở đây là bạn gián tiếp), chúng ta có thể viết như sau:
MATCH (john {name: 'John'})-[:FRIEND]->()-[:FRIEND]->(fof)
RETURN john.name, fof.name
# Kết quả sẽ trả về *"Maria"* và *"Steve"*
Tiếp đến chúng ta hãy thêm filter vào câu truy vấn, giả sử chúng ta có một list tên của các user và bây giờ chúng ta muốn tìm ra tất cả các node có trong CSDL khớp với tên có trong list kia. Đi kèm với việc tìm nodes chúng ta còn phải trả ra thông tin những người bạn của các node đó với điều kiện tên phải bắt đầu bằng chữ "S"
MATCH (user)-[:FRIEND]->(follower)
WHERE user.name IN ['Joe', 'John', 'Sara', 'Maria', 'Steve'] AND follower.name =~ 'S.*'
RETURN user.name, follower.name
# Kết quả sẽ trả về *"Sara"* và *"Steve"*
Trên đây là những ví dụ về cách sử dụng mệnh để trong graph, ngoài những mệnh để phía trên chúng ta còn sử dụng một số mệnh đề khác:
- CREATE( hoặc DELETE): dùng để create hoặc delete các nodes hoặc relationship
- SET(hoặc REMOVE): SET sẽ dùng để thiết lập giá trji cho các thuộc tính và gán labels cho các node và REMOVE sẽ được dùng để xóa chúng
- MERGE: được dùng để Match những cái đã tồn tại hoặc tạo mới các nodes hay pattern, MERGE rất hữu ích khi chúng ta sử dụng nó kết hợp với ràng buộc duy nhất
All rights reserved