1. Trang chủ
  2. » Luận Văn - Báo Cáo

CÀI ĐẶT MẠNG XÃ HỘI VỚI NEO4J - ỨNG DỤNG SOCIAL NETWORK WORKSHOP USING NEO4J

59 1,6K 21

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 59
Dung lượng 1,45 MB

Nội dung

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 1

LỜ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 2

3 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 3

LỜ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 4

PHẦ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 5

Cơ 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 6

III Ứ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 7

Mộ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 8

4 Đườ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 9

Duyệ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 10

Thự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 11

StatusUpdate 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 12

Bướ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 13

c 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 14

ClientResponse 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 15

4 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 16

5 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 17

6 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 19

khi 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 20

V 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 21

Traverser 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 22

Evaluation 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 23

Việ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 24

output += 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 26

Relationship 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 28

ii 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

Ngày đăng: 10/04/2015, 13:20

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w