5. Nội dung nghiên cứu
1.1.3. Một số ứng dụng của cơ sở dữ liệu đồ thị
Khi áp dụng cơ sở dữ liệu đồ thị vào thực tế, với thực trạng kỹ thuật và các ràng buộc về tài chính, các tổ chức/doanh nghiệp vẫn chọn cơ sở dữ liệu đồ thị bởi những lý do sau :
- Hiệu quả ―Từ phút đến mili giây‖: t nh hiệu quả và t nh đáp ứng của truy vấn là những vấn đề đƣợc quan tâm nhất của các bài toán. Các hệ thống giao dịch trực tuyến, các ứng dụng web lớn cụ thể thì đều phải đáp ứng, phản hồi lại cho khách hàng (ngƣời dùng đầu cuối) trong một số mili giây nhất định nếu họ muốn thành công. Cơ sở dữ liệu đồ thị tỏ ra hiệu quả hơn rất nhiều so với cơ sở dữ liệu quan hệ..
- Chu kỳ phát triển có gia tốc lớn
- Đáp ứng t nh thƣơng mại cực ổn: không phải di chuyển dữ liệu nhiều, đáp ứng đƣợc t nh hay thay đổi của kinh doanh.
- Tính sẵn sàng cho doanh nghiệp: dữ liệu rất quan trọng, làm việc trong các ứng dụng kinh doanh quan trọng cần một công nghệ mạnh mẽ, có khả năng mở rộng và có tính giao dịch…
1.1.3.1. Xã hội.
Có thể từ lấy ví dụ là mạng xã hội Facebook. Mạng xã hội giúp ta xác định đƣợc các mối quan hệ trực tiếp và gián tiếp giữa các cá nhân, các nhóm và những gì họ tƣơng tác, cho phép ngƣời dùng có thể đánh giá, bình luận và khám phá. Với những mối quan hệ gián tiếp, chúng ta có thể từ đó li n kết các đối tƣợng với nhau dựa trên các ý kiến, sở thích, hành vi mua sắm… để từ đó đƣa ra các gợi ý phù hợp và có độ chính xác cao.
1.1.3.2. Các Hệ gợi ý
Các gợi ý hiệu quả là ví dụ điển hình của việc đƣa đến cho ngƣời dùng đầu cuối những giá trị thông qua việc áp dụng khả năng suy luận hoặc gợi ý.
Các thuật toán đƣợc sử dụng là quy nạp, gợi ý, xác định con ngƣời, sản phẩm hoặc dịch vụ mà các cá nhân hoặc nhóm quan tâm đến. Chúng thiết lập mối quan hệ giữa ngƣời và ngƣời, ngƣời và sản phẩm hay bất cứ thứ gì trong phạm vi lĩnh vực đang đƣợc gợi ý. Các mối quan hệ đƣợc thiết lập dựa trên hành vi của ngƣời sử dụng. Từ đó bộ máy làm việc sẽ xác định nguồn lực quan tâm đến cá nhân hay nhóm có sở thích về một lĩnh vực của một tổ chức nào đó. Đây là phƣơng pháp thứ nhất.
Phƣơng pháp thứ hai là xác định ngƣời dùng hoặc nhóm ngƣời dùng cho một nguồn lực cụ thể, tập trung vào các đặc tính của nguồn lực đó bằng các câu hỏi. Từ đó bộ máy làm việc xác định các nguồn lực tƣơng tự nhƣ thế và để ngƣời dùng kết hợp với chúng.
1.1.3.3. Địa lý.
Các ứng dụng về không gian địa lý của cơ sở dữ liệu đồ thị đặc biệt có li n quan đến các lĩnh vực viễn thông, hậu cần, du lịch, lập lịch và quy hoạch tuyến đƣờng.
1.1.3.4. Quản lý dữ liệu chủ
Cơ sở dữ liệu đồ thị không cung cấp một giải pháp hoàn thiện về quản lý dữ liệu chủ. Nhƣng chúng đang là giải pháp tốt nhất đƣợc áp dụng cho việc mô hình, lƣu trữ và truy vấn của hệ thống phân cấp, siêu dữ liệu chủ và các mô hình dữ liệu chủ.
1.1.3.5. Quản lý trung tâm dữ liệu và quản lý trung tâm mạng
Giải pháp cơ sở dữ liệu đồ thị hỗ trợ các công cụ phân tích và quản lý mạng hiện tại. Nhƣ trƣờng hợp của quản lý dữ liệu chủ, chúng có thể sử dụng để cùng mang lại dữ liệu từ các hệ thống kiểm kê khác nhau, cung cấp một cái nhìn duy nhất đối với mạng và khách hàng của chúng, từ các phần tử nhỏ nhất đến các ứng dụng và các dịch vụ hay khách hàng sử dụng chúng. Một cơ sở
dữ liệu đồ thị đại diện cho một mạng có thể đƣợc sử dụng để làm giàu cho tri thức hoạt động dựa trên các mối tƣơng quan sự kiện. Có thể giải th ch rõ hơn nhƣ sau: mỗi khi có một bộ máy tƣơng quan sự kiện suy luận một sự kiện phức tạp từ một dòng các sự kiện mạng ở mức thấp, nó có thể đánh giá tác động của sự kiện đó bằng cách sử dụng mô hình đồ thị và sau đó k ch hoạt bất kỳ hoạt động giảm nhẹ cần thiết nào.
Ngày nay, cơ sở dữ liệu đồ thị đã đƣơc sử dụng thành công trong các lĩnh vực viễn thông, quản lý và phân tích mạng, quản lý nền tảng đám mây, trung tâm dữ liệu và quản lý phần tử IT. Hiệu suất cao, tính linh hoạt trong việc đối mặt với sự thay đổi các lƣợc đồ mạng cũng nhƣ phù hợp với miền là các yếu tố quan trọng của cơ sở dữ liệu đồ thị.
1.1.3.6. Ủy quyền và kiểm soát truy cập (truyền thông)
Một cơ sở dữ liệu đồ thị có thể lƣu trữ các cấu trúc phức tạp, cũng nhƣ các cấu trúc kiểm soát truy cập có kết nối dày đặc bao trùm hàng tỉ các bên tham gia và các nguồn tài nguyên. Nó cấu trúc các mô hình dữ liệu không lƣợc đồ hỗ trợ cả cấu trúc phân cấp và không phân cấp, trong khi mô hình thuộc tính mở rộng của nó cho phép nắm bắt siêu dữ liệu phong phú liên quan đến mỗi phần tử của hệ thống. Với một công cụ truy vấn có thể đi qua hàng triệu mối quan hệ mỗi giây, thì xử lý tìm kiếm lớn, cấu trúc phức tạp chỉ thực hiện trong mili giây.
1.2. Cơ sở dữ li u đồ thị Neo4j
1.2.1. Giới thiệu chung
Nhƣ từ đầu luận văn này, lý thuyết đồ thị cung cấp cho chúng ta nhiều kiểu đồ thị khác nhau để làm việc. Đồ thị có nhiều hình dạng và kích cỡ khác nhau, và do đó, Neo4j cần chọn một loại cấu trúc dữ liệu rất cụ thể đủ linh hoạt để hỗ trợ tính linh hoạt theo yêu cầu của các bộ dữ liệu trong thế giới
thực. Đây là lý do tại sao mô hình dữ liệu cơ bản của Neo4j, đồ thị thuộc tính đƣợc gắn nhãn, là một trong những mô hình đồ thị chung và linh hoạt nhất.
Mô hình dữ liệu đồ thị này cung cấp cho chúng ta bốn cấu trúc cơ bản khác nhau để lƣu trữ dữ liệu. Đó là: Nodes, Labels, Relationships và Properties.
1.2.2. Mô hình dữ liệu
Theo [3], luận văn sẽ sử dụng đồ thị ví dụ dƣới đây để giới thiệu các khái niệm cơ bản về Đồ thị thuộc tính gắn nhãn:
1.2.2.1. Nút (Nodes)
Đơn vị cơ bản để hình thành một đồ thị là các nút và các mối quan hệ. Trong Neo4j, cả nút và các mối quan hệ đều có thể chứa thuộc tính. Các nút thƣờng đƣợc sử dụng để đại diện cho các thực thể.
Đây là cơ sở dữ liệu đồ thị đơn giản nhất với 1 nút
1.2.2.2 Nhãn (Label)
Nhãn đƣợc sử dụng để định hình miền bằng cách nhóm các nút thành các tập hợp mà tất cả các nút có một nhãn nhất định thuộc cùng một tập hợp.
1.2.2.3. Quan hệ (Relationships)
Mối quan hệ giữa các nút trong đồ thị là một phần quan trọng, dựa vào đó có thể tìm kiếm dữ liệu có liên quan. Mối quan hệ cũng có thể có thuộc tính.
Mối quan hệ kết nối 2 nút đƣợc đảm bảo hợp lệ từ nút bắt đầu đến nút kết thúc
* Hƣớng (loại) quan h (Relationship types).
Một Relationships phải có chính xác một Relationship types.
Mối quan hệ luôn có hƣớng, đƣợc xác định theo hƣớng đi vào hoặc đi ra một nút. Đây là yếu tố quan trọng đƣợc sử dụng khi duyệt đồ thị.
1.2.2.4. Thuộc tính (Properties)
Cả mối quan hệ và nút đều có thể có thuộc tính. Các thuộc tính sẽ là cặp khóa- giá trị mà khóa chính là một chuỗi. Giá trị của thuộc tính có thể là một kiểu giá trị nguyên thủy hoặc mảng giá trị nguyên thủy. Ví dụ: String, int, int[].
Ví dụ:
Trong ví dụ trên, đồ thị có 1 thuộc tính tên là “name”, với giá trị là “ Thu”.
1.2.2.5. Duyệt đồ thị (Traversals)
Duyệt qua đồ thị có nghĩa là truy cập các nút bằng cách tuân theo các mối quan hệ theo một số quy tắc.
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
1.2.4. Python với Neo4j Desktop
1.2.4.1. Thư viện py2neo
Để thực thi các truy vấn Cypher trên Neo4j bằng NNLT Python, luận văn sử dụng thƣ viện py2neo.
* C đặt t ƣ vi n:
$ pip install --upgrade py2neo Hoặc
$ pip install
git+https://github.com/technige/py2neo.git@master#egg=py2neo
* Tƣơn t :
Các phiên bản Python và Neo4j sau (tất cả các phiên bản): Python 2.7 / 3.4 / 3.5 / 3.6 / 3.7 / 3.8 / 3.9
Neo4j 3.4 / 3.5 / 4.0 / 4.1 / 4.2 / 4.3 (khuyến nghị sử dụng phiên bản mới nhất)
Py2neo cung cấp hỗ trợ cho chức năng đa cơ sở dữ liệu đƣợc bổ sung trong Neo4j 4.0
Tham khảo thêm tại: https://py2neo.org/2021.1/#
1.2.4.2. Thực thi truy vấn Cypher bằng NNLT Python
Đoạn mã sau minh họa việc thực thi một truy vấn Cypher bằng Python trên Jupyter, tìm tất cả các phim cùng rating mà một ngƣời dùng cụ thể đã xem và đánh giá:
#Kết nối Neo4j qua thư viện py2neo from py2neo import Graph, Node
graph=Graph("bolt://localhost:7687",auth=("neo4j", "123456789")) #Thực thi truy vấn Cypher
query = 'MATCH (u:User{id:’User 1’})-[r:RATED]->(m:Movie) RETURN u.id AS uid, m.id AS mid, r.rating AS rating '
ratings=graph.run(query).to_data_frame()
1.2.5. Chỉ mục (Indexing)
Hình 1. 11. Tổn quan về CSDL đồ t ị
―Một chỉ mục – đƣợc nối từ các thuộc tính – đến các node hoặc các mối quan hệ‖
Mục đ ch của việc đánh chỉ mục (indexing) là tìm kiếm đƣợc nhanh chóng và ch nh xác trong cơ sở dữ liệu đồ thị.
Ta thấy, một cơ sở dữ liệu đồ thị sẽ quản lý các chỉ mục và đồ thị gồm các node và các cạnh. Đồ thị lƣu trữ thông tin của chúng thông qua các node và các mối quan hệ giữa các node. Các chỉ mục sẽ ánh xạ đến từng node, từng
Traversal
Indexes Graph Algorithm
Paths Relationships Node Properties Graph Database managers
managers navigates identifies
expresses map from map to map to organize have have R ec o rds da ta
mối quan hệ giữa các node, và đến các thuộc tính của các node và các mối quan hệ đó. Để thực hiện truy vấn trong 1 cơ sở dữ liệu đồ thị, ta thực hiện một phép duyệt đồ thị dựa trên một giải thuật để xác định đƣờng đi theo thứ tự của các node.
1.2.5.1. Tạo chỉ mục
- Tạo chỉ mục thuộc t nh đơn tr n các nút: Có thể tạo chỉ mục đƣợc đặt tên trên một thuộc tính cho tất cả các nút có nhãn cụ thể CREATE INDEX
index_name FOR (n:Label) ON (n.property). Lƣu ý rằng chỉ mục
không có sẵn ngay lập tức mà đƣợc tạo ở chế độ nền.
CREATE INDEX node_index_name FOR (n:Person) ON (n.surname)
Lƣu ý rằng tên chỉ mục cần phải là duy nhất.
- Tạo chỉ mục thuộc t nh đơn tr n các mối quan hệ: Có thể tạo chỉ mục đƣợc đặt tên trên một thuộc tính cho tất cả các mối quan hệ có kiểu quan hệ
cụ thể CREATE INDEX index_name FOR ()-[r:TYPE]-() ON
(r.property). Lƣu ý rằng chỉ mục không có sẵn ngay lập tức mà đƣợc tạo ở
chế độ nền.
CREATE INDEX rel_index_name FOR ()-[r:KNOWS]-() ON (r.since)
Lƣu ý rằng tên chỉ mục cần phải là duy nhất.
- Chỉ tạo một chỉ mục thuộc tính duy nhất nếu nó chƣa tồn tại:
CREATE INDEX node_index_name IF NOT EXISTS FOR (n:Person) ON (n.surname)
Lƣu ý rằng chỉ mục sẽ không đƣợc tạo nếu đã tồn tại một chỉ mục có cùng tên, cùng một lƣợc đồ hoặc cả hai.
- Tạo chỉ mục thuộc t nh đơn với indexProvider đƣợc chỉ định
(r.prop1) OPTIONS {indexProvider:'native-btree-1.0'}
- Tạo chỉ mục thuộc t nh đơn với indexConfig đƣợc chỉ định
CREATE BTREE INDEX index_with_config FOR (n:Label) ON (n.prop2) OPTIONS {indexConfig: {`spatial.cartesian.min`: [-100.0,