Người sử dụng muốn có một cầu nối, một biện pháp để giải quyết những vấn đề trên do đó dữ liệu đồ thị ra đời..Dữ liệu đồ thị là cách thức lưu trữ thông tin ở dạng đồ thị những đỉnh và cạ
Trang 1LỜI MỞ ĐẦU 3
PHẦN I TỔNG QUAN VỀ CƠ SỞ DỮ LIỆU ĐỒ THỊ 4
I Khái quát đồ thị 4
II Cơ sở dữ liệu đồ thị 4
III Ứng dụng của cơ sở dữ liệu đồ thị 6
PHẦN II NEO4J TRONG VIỆC CÀI ĐẶT MẠNG XÃ HỘI 6
I Neo4j là một cơ sở dữ liệu đồ thị 6
II Sử dụng Neo4j vào các ứng dụng java 11
IV Sử dụng API REST từ Java 13
1 Tạo một đồ thị với REST API từ Java 13
2 Khởi động server 13
3 Tạo một node 14
4 Thêm thuộc tính 15
5 Thêm quan hệ 16
6 Thêm thuộc tính vào một quan hệ 16
7 Truy vấn đồ thị 17
V Framework duyệt đồ thị Java API 19
VI Giải thuật đồ thị 23
1 Ví dụ về giải thuật đồ thị 24
2 Xây dựng giải thuật đồ thị 25
i Tìm tất cả đường đi ngắn nhất 26
ii Tìm một trong những đường đi ngắn nhất giữa những node 28
iii Thực thi giải thuật Dijkstra với cùng trọng lượng của mối quan hệ 30
iv Giải thuật Dijkstra với trọng lượng quan hệ khác nhau 32
VII Cài đặt và triển khai 33
1 Server 33
2 Nhúng vào (embedded) 34
3 Cài đặt 34
4 Cài đặt một ứng dụng 34
VIII Quản trị bằng web 35
PHẦN III : CÀI ĐẶT MẠNG XÃ HỘI VỚI NEO4J - ỨNG DỤNG SOCIAL NETWORK WORKSHOP USING NEO4J 40
I Giới thiệu 40
1 Bước 1 – cơ bản về mạng xã hội 40
2 Bước 2 – Thêm những kiểu quan hệ 44
Trang 23 Bước 3 – giới hiệu chỉ mục cho mạng xã hội 45
4 Giới thiệu domain API 46
5 Bước 5 – giải thuật đồ thị 47
6 Bước 6 – Sự đề cử 48
II Cách cài đặt 48
1 Junit Test Bước 1 48
2 Junit Test Bước 2 50
3 Junit test bước 3 51
4 Junit test bước 4 52
5 Junit test bước 5 53
6 Junit test bước 6 54
KẾT LUẬN 56
TÀI LIỆU THAM KHẢO 58
Trang 3LỜI MỞ ĐẦU
Ngày nay, hầu hết các ứng dụng đều có một lượng dữ liệu khổng lồ.Vấn đề lưu trữ và xử
lý dữ liệu trở nên khó khăn và cần được quan tâm hơn, dữ liệu linh hoạt và được thay đổi gần như theo thời gian thậm chí thay đổi cấu trúc cơ bản của dữ liệu Việc xử lý đòi hỏi phải linh hoạt và không làm gián đoạn ứng dụng.Với hệ thống lưu trữ hiện tại không thể linh động với đòi hỏi này
Người sử dụng muốn có một cầu nối, một biện pháp để giải quyết những vấn đề trên do
đó dữ liệu đồ thị ra đời Dữ liệu đồ thị là cách thức lưu trữ thông tin ở dạng đồ thị những đỉnh và cạnh.Với cách thức lưu trữ này, việc quản lý dữ liệu trở nên mềm dẽo và dễ dàng hơn ngay cả trong việc ứng dụng tri thức vào khối dữ liệu lưu trữ.
Tiểu luận này là sự trình bày khái quát về cơ sở dữ liệu đồ thị với Neo4j, đồng thời trình bày trình bày một cách chi tiết việc tạo một đồ thị Neo4j bằng Java API và ứng dụng cài đặt mạng xã hội đơn giản với Neo4j
Em xin chân thành cảm ơn PGS.TS Đỗ Phúc – Giảng viên môn học cơ sở dữ liệu nâng cao đã truyền đạt những kiến thức vô cùng quý báu, xin chân thành cám ơn ban cố vấn học tập và ban quản trị chương trình đào tạo thạc sĩ Công nghệ thông tin qua mạng của Đại Học Quốc Gia TPHCM đã tạo điều kiện về tài liệu tham khảo để em có thể hoàn thành môn học này.
Chân thành cám ơn!
Nguyễn Xuân Nghề
Trang 4PHẦN I TỔNG QUAN VỀ CƠ SỞ DỮ LIỆU ĐỒ THỊ
I Khái quát đồ thị
Đồ thị là một tập các đối tượng được gọi là các đỉnh được nối với nhau bởi các
cạnh.Có 2 loại đồ thị : đồ thị vô hướng và đồ thị có hướng
Đồ thị vô hướng
Đồ thị có hướng
Cấu trúc đồ thị có thể mở rộng bằng cách gán trọng số cho các cạnh của đồ thị Có thể
sử dụng đồ thị trọng số để biểu diễn những khái niệm khác nhau như chiều dài con đường,thời gian đi giữa hai nút, độ mạnh liên kết giữa các nút, số giao tác kết nối giữa 2 nút ở một thời điểm nào đó…
Nhiều bài toán thực tế có thể được biểu diễn bằng đồ thị Ví dụ, cấu trúc liên kết của một website có thể được biểu diễn bằng một đồ thị có hướng, XML, cấu trúc phân tử hóa học, cấu trúc protein, đối tượng 3D…
II Cơ sở dữ liệu đồ thị
a Giới thiệu :
Trang 5Cơ sở dữ liệu đồ thị là tập các đồ thị.Một cơ sở dữ liệu đồ thị có thể có nhiều đồ thị nhưng cũng có thể chỉ có một đồ thị, đó là một đồ thị rất lớn chứa nhiều nút và đỉnh ví dụ như mạng xã hội
b Cách lưu trữ dữ liệu đồ thị :
Dữ liệu được lưu trữ thành những dòng và cột trong những table khác nhau.Dữ liệu được truy xuất bằng câu lệnh SQL SQL cho phép người sử dụng truy xuất khá mạnh mẽ dữ liệu đồ thị bao gồm cả việc trích xuất dữ liệu mới từ dữ liệu đã lưu trữ Mặc dù có nhiều điểm mạnh nhưng SQL không thể hổ trợ những thao tác tính toán, những biểu thức phức tạp một cách linh hoạt và tùy lúc.Ví dụ như tính chi phí một con đường đi từ đỉnh này để đỉnh khác, tìm chi phí thấp nhất để đi giữa hai nút cho trước…
Để giải quyết vấn đề trên DB2 và RDBMS đã mở rộng SQL bằng cách xây dựng nhưng hàm cụ thể được gọi là user-defined functions (UDFs) UDFs được sử dụng mọi nơi mà người sử dụng muốn
SBGE sử dụng những hàm mở rộng của DB2 để thao tác trên dữ liệu đồ thị.Với SBGE có thể dễ dàng quản lý dữ liệu đồ thị thông qua các nút, cạnh
Với RDBMSs cho phép người sử dụng định nghĩa cũng như tìm kiếm những đồ thị con RDBMSs có thể linh hoạt trên một đồ thị dữ liệu lớn bởi vì SQL có thể tìm kiếm
mà không đòi hỏi việc load cả dữ liệu đồ thị lên bộ nhớ tạm Do đó, SBGE chính là sự kết hợp giữa SQL để quản lý dữ liệu của đồ thị và những hàm mở rộng để quản lý nhữnghàm truy xuất của đồ thị
Lưu trữ bằng neo4j
Neo4j là một cơ sở dữ liệu nổi tiến hiện nay Tiểu luận này sẽ trình bày chi tiết cách sử dụng neo4j để xây dựng mạng xã hội
Trang 6III Ứng dụng của cơ sở dữ liệu đồ thị
Dữ liệu đồ thị có nhiều ứng dụng trong thực tế như : trong sinh học (dùng cơ sở dữliệu đồ thị để lưu trữ cấu trúc genes, protein hoặc mô hình của một tế bào…), trong hóa học ( Cấu trúc phân tử của một chất), lưu trữ ảnh, mạng xã hội, cấu trúc liên kết
website…
PHẦN II NEO4J TRONG VI C CÀI Đ T M NG XÃ H I ỆC CÀI ĐẶT MẠNG XÃ HỘI ẶT MẠNG XÃ HỘI ẠNG XÃ HỘI ỘI
I Neo4j là một cơ sở dữ liệu đồ thị
Neo4j là một cơ sở dữ liệu đồ thị mã nguồn mở Làm việc với nó ứng dụng chúng ta sẽ được hiển thị như một đồ thị
Trang 7Một liên hệ liên kết 2 nodes, và tạo ra một điểm bắt đầu node và điểm kết thúc node
Những mối quan hệ luôn luôn có hướng, chúng có thể hiển thị mối liên hệ đến mộtnode (incoming relationship) hoặc mối liên hệ đi từ một node(outgoing
relationship)
3 Thuộc tính
Cả hai nodes và mối liên hệ có thể có những thuộc tính Thuộc tính là những cặp key-value, trong đó key là chuổi giá trị của thuộc tính có thể là chuỗi, integer mảng integer…
Trang 84 Đường dẫn
Một đường dẫn là một hoặc nhiều nodes với những mối quan hệ được liên kết với nhau, nó được hiển thị khi thực hiện một câu truy vấn hoặc một kết quả duyệt đồ thị
Trang 9Duyệt đồ thị nghĩa là duyệt qua những nodes của đồ thị theo những mối quan hệ với những luật có sẳng Trong hầu hết trường hợp chỉ có đồ thị con được duyệt qua
Neo4j có traversal API sẽ giúp chúng ta xác định những luật để duyệt đồ thị Ở mức độ cơ bản ta có duyệt theo chiều rộng và duyệt theo chiều sâu
6 Mô hình mạng xã hội
Mạng xã hội(được biết như là một đồ thị xã hội trên web) thực tế nó như là một mô hình của đồ thị Ví dụ này sẽ trình bày một mô hình mạng xã hội đơn giản có chứa thông tin về những người bạn kết nối với nhau và có thể theo dõi những trạng thái(status) của nhau
Mô hình mạng xã hội đơn giản
Mô hình mạng xã hội tương đối đơn giản: những persons với tên và những status được cập nhật dưới dạng văn bản text Những thực thể được liên kết với nhau bằng những mối quan hệ xác định
Person:
Friend: person và friend là hai người khác nhau
Status: person liên kết với những status được cập nhật gần nhất
StatusUpdate:
next: chỉ ra rằng những status kế tiếp trong chuỗi status, nó chỉ cái status được post lên trước status hiện tại
Trang 10Thực thể status graph
Danh sách StatusUpdate cho một person là một danh sách liên kết Đỉnh của danh sách
(những status gần đây nhất) được tìm thấy từ những status theo sau nó Mỏi
StatusUpdate theo sau được liên kết bởi next.
Dưới đây là ví dụ với Andreas Kollegger làm việc tại buổi sang:
Để có thể đọc những status cập nhật, chúng ta có thể tạo một traversal như sau:
TraversalDescription traversal = Traversal.description() depthFirst() relationships( NEXT );
Luồng hoạt động
Khi chúng ta có bạn, và họ có những status, chúng ta có thể muốn đọc những status của những người bạn chúng ta theo trình tự thời gian cái nào mới nhất trước Thực hiện được điều này qua những bước sau đây:
1.thu thập tất cả status của bạn và cập nhật vào một danh sách, status gần nhất lên đầu2.sắp xếp danh sách
3.trả về phần tử đầu tiên của danh sách
4.nếu phần đầu tiên không có giá trị, xóa nó trong danh sách và lấy phần tử tiếp theo5.trở lại bước 2 cho đến khi không còn phần tử nào trong danh sách
Trang 11StatusUpdate returnVal = first.current();
II Sử dụng Neo4j vào các ứng dụng java
Thật dễ dàng để thực hiện những ứng dụng Java với Neo4j Trong phần này chúng ta sẽ tìm thấy tất cả mọi thứ cần thiết cho việc viết một ứng dụng Java với Neo4j
Tất cả mối quan hệ có một kiểu Ví dụ, nếu đồ thị hiển thị một mạng xã hội, một kiểu của mối quan hệ là KNOWS Nếu có một mối quan hệ kiểu KNOWS liên kết giữa 2 nodes, nó hiển thị rằng hai người này biết lẫn nhau
a Chuẩn bị database
Những kiểu mối quan hệ có thể được tạo bằng cách sử dụng một enum Trong
ví dụ này chúng ta chỉ cần một kiểu mối quan hệ đơn giản:
private static enum RelTypes implements RelationshipType
{
Trang 12Bước tiếp theo là khởi động server dữ liệu.
graphDb = new GraphDatabaseFactory().n
registerShutdownHook( graphDb );
Như chúng ta thấy, chúng ta đăng ký một shutdown hook để chắc chắn rằng
database sẽ tắt khi JVM tắt để giải phóng server dữ liệu và bây giơ chúng ta bắt đầu tương tác với database
b Tạo một Small graph
Bây giờ, chúng ta bắt đầu tạo vài nodes, ở đây chúng ta tạo một đồ thị nhỏ với
2 nodes liên kết với một mối quan hệ và có vài thuộc tính:
firstNode = graphDb.createNode();
firstNode.setProperty( "message", "Hello, " );
secondNode = graphDb.createNode();
secondNode.setProperty( "message", "World!" );
relationship = firstNode.createRelationshipTo( secondNode,
relationship.setProperty( "message", "brave Neo4j " );
đồ thị của chúng ta giống như thế này:
Trang 13c Hiển thị kết quả
sau khi chúng ta đã tạo đồ thị, chúng ta có thể đọc nó và in ra kết quả
System.out.print( firstNode.getProperty( "message" ) );
System.out.print( relationship.getProperty( "message" ) );
System.out.print( secondNode.getProperty( "message" ) );
Kết quả sẽ là:
Hello, brave Neo4j World!
d Xóa dữ liệu
Chúng ta tiến hành xóa dữ liệu như sau:
// let's remove the data
firstNode.getSingleRelationship( RelTypes.KNOWS, Direction.OUTGOING ).delete();
firstNode.delete();
secondNode.delete();
chú ý rằng việc xóa một node vẫn còn mối quan hệ sẽ bị báo lỗi vì vậy cần xóa mối quan hệ trước bởi vì một mối quan hệ tồn tại khi nó có node bắt đầu và node kết thúc
e Shut down server cơ sở dữ liệu
Cuối cùng, chúng ta shut down server cơ sở dữ liệu khi đã hoàn thành ứng dụng:
graphDb.shutdown();
IV Sử dụng API REST từ Java
1 Tạo một đồ thị với REST API từ Java
REST API sử dụng HTTP và JSON, vì vậy nó có thể được sử dụng từ nhiều ngôn ngữ và platforms Trong phần này chúng ta sẽ tìm hiểu làm thế nào để tạo ra một đồ thị đơn giản với REST API cũng như làm thế nào để truy vấn nó
2 Khởi động server
Trước khi có thể thực hiện bất kỳ thao tác nào trên server, chúng ta cần khởi động nó
WebResource resource = Client.create().resource( SERVER_ROOT_URI );
Trang 14ClientResponse response = resource.get( ClientResponse.class );
System.out.println( String.format( "GET on [%s], status code [%d]",
// POST {} to the node entry point URI
ClientResponse response = resource.accept( MediaType.APPLICATION_JSON )
"POST to [%s], status code [%d], location header [%s]",
nodeEntryPointUri, response.getStatus(), location.toString() ) );
Trang 154 Thêm thuộc tính
Khi chúng ta có nodes trong cơ sở dữ liệu, chúng ta có thể sử dụng chúng để lưu trữ
những dữ liệu có ích Trong trường hợp này, chúng ta sẽ lưu thông tin và music vào trong
cơ sở dữ liệu chúng ta Chúng ta tạo những nodes và thêm thuộc tính vào Ở đây chúng tathêm những nodes hiển thị “Joe Strummer” và một ban nhạc gọi là “The Clash”
URI firstNode = createNode();
addProperty( firstNode, "name", "Joe Strummer" );
URI secondNode = createNode();
addProperty( secondNode, "band", "The Clash" );
Trong phương thức addProperty chúng ta xác định nguồn mà sẽ hiển thị thuộc tính cho
node và xác định tên của thuộc tính đó Sau đó chúng ta thực hiện tiến trình PUT những giá trị của thuộc tính lên server
String propertyUri = nodeUri.toString() + "/properties/" + propertyName;
Nếu mọi thứ tiến triển tốt, chúng ta sẽ nhận 204 No Content back chỉ ra rằng server đã
xử lý yêu cầu nhưng không hiển thị lại giá trị thuộc tính
Trang 165 Thêm quan hệ
Bây giờ chúng ta có những nodes hiển thị Joe Strummer và The Class, chúng ta hãy
làm cho chúng có quan hệ với nhau
URI relationshipUri = addRelationship( firstNode, secondNode, "singer",
private static URI addRelationship( URI startNode, URI endNode,
String relationshipType, String jsonAttributes )
throws URISyntaxException
{
URI fromUri = new URI( startNode.toString() + "/relationships" );
String relationshipJson = generateJsonRelationship( endNode, relationshipType, jsonAttributes );
WebResource resource = Client.create() resource( fromUri );
// POST JSON to the relationships URI
ClientResponse response =
resource.accept( MediaType.APPLICATION_JSON ).type( MediaType.APPLICATION_JSON ) entity( relationshi pJson ).post( ClientResponse.class );
final URI location = response.getLocation();
System.out.println( String.format( "POST to [%s], status code [%d], location header [%s]", fromUri,
response.getStatus(), location.toString() ) );
response.close();
return location;
}
Trang 176 Thêm thuộc tính vào một quan hệ
Giống như nodes, quan hệ cũng có thể có những thuộc tính Giả sử chúng ta là fans hâm
mộ của Joe Strummer và The Clash, chúng ta sẽ thêm vào một rating cho mối quan hệ
này vì vậy những người khác có thể thấy rằng Joe Strummer là một ca sĩ 5 sao trong ban nhạc
addMetadataToProperty( relationshipUri, "stars", "5" );
Trong phương thức addMetadataToProberty, chúng ta xác định URI của thuộc tính của
mối quan hệ và PUT giá trị mới vào (PUT sẽ ghi đè lên những giá trị đã tồn tại, hãy cẩn thận điều này)
private static void addMetadataToProperty( URI relationshipUri,
String name, String value ) throws URISyntaxException
{
URI propertyUri = new URI( relationshipUri.toString() + "/properties" );
String entity = toJsonNameValuePairCollection( name, value );
WebResource resource = Client.create()
Trang 18Để bắt đầu quá trình, chúng ta sử dụng một lớp đơn giản có thể chuyển những thông tin của đồ thị sang dạng dữ liệu JSON tương ứng, sẳng sàng cho việc POST-ing lên server Trong trường hợp này chúng ta phải lập trình(hardcode) để tìm tất cả những nodes với cómối quan hệ với kiểu “singer”
// TraversalDescription turns into JSON to send to the Server
TraversalDescription t = new TraversalDescription();
t.setOrder( TraversalDescription.DEPTH_FIRST );
t.setUniqueness( TraversalDescription.NODE );
t.setMaxDepth( 10 );
t.setReturnFilter( TraversalDescription.ALL );
t.setRelationships( new Relationship( "singer", Relationship.OUT ) );
khi chúng ta đã định nghĩa những tham số của quá trình tìm kiếm, chúng ta chỉ cần transfer chúng Chúng ta làm điều này bằng cách xác định URI của quá trình tìm kiếm cho node bắt đầu, và sau đó POST-ing dạng hiển thị JSON của nó
URI traverserUri = new URI( startNode.toString() + "/traverse/node" );
WebResource resource = Client.create()
.resource( traverserUri );
String jsonTraverserPayload = t.toJson();
ClientResponse response = resource.accept( MediaType.APPLICATION_JSON )
Trang 19khi yêu cầu của chúng ta được thực hiện, chúng ta nhận về dữ liệu về singer và bans
theo yêu đúng yêu cầu
[ {
"outgoing_relationships" : "http://localhost:7474/db/data/node/82/relationships/out",
"data" : {
"band" : "The Clash",
"name" : "Joe Strummer"
Trang 20V Framework duyệt đồ thị Java API
Order: ví dụ như duyệt theo chiều sâu hoặc duyệt theo chiều rộng
Uniqueness: ghé thăm nodes(mối quan hệ, đường dẫn) chỉ một duy nhất
Evaluator: quyết định cái gì cần trả về, khi nào dừng hoặc tiếp tục duyệt đồ thị tại vị trí
node hiện tại
Starting nodes:node mà quá trình duyệt sẽ bắt đầu.
2 Framework duyệt đồ thị Java API
Framework duyệt đồ thị chứa đựng những giao diện (interfaces) chính trong
Trang 21Traverser và Uniqueness là những phần chính Giao diện path cũng có mục đích đặt biệt trong việc duyệt đồ thị, nó dùng để hiển thị một vị trí trong đồ thị khi đã thực hiện việc tính toán đối với vị trí này Hơn nữa giao diện
PathExpander và Expander là trung tâm của quá trình duyệt đồ thị, nhưng người dùng ít cài đặt chúng
a TraversalDescription TravesalDescription là giao diện chính được dùng trong việc định nghĩa
và khởi tạo quá trình duyệt đồ thị
Thực thể TraversalDescription là không thay đổi và những phương thức của
nó trả về một đối tượng new TraversalDescription
b Đánh giá (Evaluator) Evaluator được sử dụng cho việc quyết định, tại mỏi vị trí(hiển thị trên đồ
thị) sẽ được duyệt tiếp hay thêm node tại vị trí này vào kết quả Chúng ta cómột trong bốn hành động sau đây của quá trình duyệt động thị
Evaluation.INCLUDE_AND_CONTINUE: Thêm node này vào danh sách kết quả và tiếp tục duyệt
Evaluation.INCLUDE_AND_PRUNE: Thêm node này vào danh sách kết quả và không duyệt nữa
Evaluation.EXCLUDE_AND_CONTINUE: Không thêm node này vào danh sách kết quả và tiếp tục duyệt
Trang 22Evaluation EXCLUDE _AND_ PRUNE: Không thêm node này vào danh sách kết quả và không duyệt nữa.
c Duy nhất (Uniqueness)
Tập hợp những luật cho việc những vị trí có thể được duyệt lại trong suốt quá trìnhduyệt đồ thị được quy định trong Uniqueness Mặt định là NODE_GLOBAL
Có rất nhiều uniqueness được sử dụng trong Neo4j:
NONE: bất kỳ vị trí nào trong đồ thị có thể được duyệt lại
duyệt hơn một lần
được duyệt hơn một lần
trước đây có node này
d Sử dụng Framework duyệt đồ thị
Trang 23Việc định nghĩa RelationshipTypes như sau:
private enum Rels implements RelationshipType {
LIKES, KNOWS }
Đồ thị có thể được duyệt với đồ thị trên, bắt đầu từ node “Joe”
for ( Path position : Traversal.description().depthFirst().relationships( Rels.KNOWS ) .relationships( Rels.LIKES, Direction.INCOMING )
.evaluator( Evaluators.toDepth( 5 ) ) traverse( node ) )
{
Trang 24output += position + "\n";
}
Kết quả hiển thị:
(7) (7)< [LIKES,1] (4) (7)< [LIKES,1] (4) [KNOWS,6] >(1) (7)< [LIKES,1] (4) [KNOWS,6] >(1) [KNOWS,4] >(6) (7)< [LIKES,1] (4) [KNOWS,6] >(1) [KNOWS,4] >(6) [KNOWS,3] >(5) (7)< [LIKES,1] (4) [KNOWS,6] >(1) [KNOWS,4] >(6) [KNOWS,3] >(5) [KNOWS,2]
>(2) (7)< [LIKES,1] (4) [KNOWS,6] >(1)< [KNOWS,5] (3)
VI Giải thuật đồ thị
Giải thuật đồ thị Neo4j là một thành phần chứa một vài giải thuật chung cho đồ thị Nó bao gồm những giải thuật như sau:
Tính đường đi ngắn nhất (ít số lượng quan hệ nhất) giữa 2 nodes:
Node startNode = graphDb.createNode();
Node middleNode1 = graphDb.createNode();
Node middleNode2 = graphDb.createNode();
Node middleNode3 = graphDb.createNode();
Trang 25// Will find the shortest path between startNode and endNode via
// "MY_TYPE" relationships (in OUTGOING direction), like f.ex:
//
// (startNode) >(middleNode1) >(endNode)
//
PathFinder<Path> finder = GraphAlgoFactory.shortestPath(
Traversal.expanderForTypes( ExampleTypes.MY_TYPE, Direction.OUTGOING ), 15 );
Iterable<Path> paths = finder.findAllPaths( startNode, endNode );
Sử dụng giải thuật Dijkstra để tính toán đường đi ngắn nhất giữa node A và B và mỗi quan hệ có một trọng số và đường đi ngắn nhất được tìm thấy
PathFinder<WeightedPath> finder = GraphAlgoFactory.dijkstra(
Traversal.expanderForTypes( ExampleTypes.MY_TYPE, Direction.BOTH ), "cost" );
WeightedPath path = finder.findSinglePath( nodeA, nodeB );
// Get the weight for the found path
path.weight();
Sử dụng A* để tính đường đi ngắn nhất giữa node A và node B, đường đi ngắn nhất ví dụnhư đường đi của những đoạn đường và có chiều dài ngắn nhất giữa node A và node B Dưới đây là ví dụ về đồ thị:
Node nodeA = createNode( "name", "A", "x", 0d, "y", 0d );
Node nodeB = createNode( "name", "B", "x", 7d, "y", 0d );
Node nodeC = createNode( "name", "C", "x", 2d, "y", 1d );
Relationship relAB = createRelationship( nodeA, nodeC, "length", 2d );
Trang 26Relationship relBC = createRelationship( nodeC, nodeB, "length", 3d );
Relationship relAC = createRelationship( nodeA, nodeB, "length", 10d );
EstimateEvaluator<Double> estimateEvaluator = new EstimateEvaluator<Double>()
{
public Double getCost( final Node node, final Node goal )
{
double dx = (Double) node.getProperty( "x" ) - (Double) goal.getProperty( "x" );
double dy = (Double) node.getProperty( "y" ) - (Double) goal.getProperty( "y" );
double result = Math.sqrt( Math.pow( dx, 2 ) + Math.pow( dy, 2 ) );
CommonEvaluators.doubleCostEvaluator( "length" ), estimateEvaluator );
WeightedPath path = astar.findSinglePath( nodeA, nodeB );
2 Xây dựng giải thuật đồ thị
Neo4j có nhiều cách xây dựng giải thuật đồ thị Chúng thực thi từ node bắt đầu Quá trìnhduyệt đồ thị được điều khiển bởi URI và gửi những nội dung yêu cầu dưới dạng requestGiải thuật(algorithm)
Nếu không được chọn, mặc định sẽ là shortestPath.algorithm có thể có một trong những giá trị sau:
Trang 28ii Tìm một trong những đường đi ngắn nhất giữa những node
Nếu đường dẫn trong giải thuật ko xác định, một giải thuật ShortestPath với chiều sâu 1
sẽ được chọn trong trường hợp này, max_depth được thiết lập là 3 để tìm đường đi ngắn nhất giữa 3 nodes liên kết