Press enter to see results or esc to cancel.

Graph – Em là ai?

Chào các mẹ , kì này thấy những kiến thức hồi năm nhất khá hay nền em tìm hiểu để viết bài cho các bác (thực ra là vì nó liên quan tới mấy cái em đang nghiên cứu, không cũng chia tay lâu rồi ).

Graph là gì?

Đầu tiên theo nghỉa tiếng việt Graph gọi là đồ thị. Mà đồ thị thì phải biểu diễn bằng hình vẽ đúng không các bác  và mục đích chính mà Graph ra đời là biểu thị mối quan hệ giữa các thực thể (Object/Entity).

Tưởng mỗi người chúng ta là một thực thể (Object) – giống như cách mà các bác hình dung ở OOP. Cuộc sống thì phức tạp, các bác không thể không quen biết, không liên hệ, không kết nối với ai được , do đó Graph sinh ra để miêu tả mối quan hệ giữa các thực thể (Object). VD có Bác (Object A) và ông già của bác (Object B) cả 2 liên hệ với nhau qua sợi dây (cha – con) . Sau này bạn cưới 1 em về (Object C) thì quan hệ giữa Object A và Object C là vợ chồng , Obj B và Obj C là bố vợ – con dâu . Graph là sợi dây miêu tả mối quan hệ giữa các thành viên trong gia đình các bác.

Hình trên là một Graph. Các bác có thể để ý nó có 2 thành phần chính là

  • Vertice (Node) – Tiếng Việt gọi là Đỉnh: Là mấy cái vòng tròn có số bên trong ở cái hình bên trái đấy các bác 
  • Edge (Connection) – Tiếng Việt gọi là Cạnh: Là mấy cái đường thẳng nối giũa các cục tròn tròn Node đấy.

Một Graph có thể là Directed (có hướng) hay Undirected (vô hướng). Ở Graph bên trên là vô hướng, các bác muốn nó có hướng thì thêm mũi tên vào mấy cái Edge (cạnh) là được (Mũi tên 1 hướng thôi nha các bác ).

Thế có hướng và vô hướng để làm gì?

  • Vô hướng: Thằng X là bạn của các bác thì dĩ nhiên bác cũng là bạn của thằng X. Đó là mối quan hệ 2 chiều, vì vậy không cần vẽ mũi tên 2 chiều làm gì, tốn mực .
  • Có hướng: Các bác thích con Y đang là hoa khôi ở trường, áp dụng bao nhiêu nhiêu sách vở lý thuyết tán gái vẫn không làm nó thích mình được, nó chỉ coi các bác là anh trai tốt/bạn tốt thôi . Đây là quan hệ 1 chiều, bác thích nó nhưng nó chỉ coi bác như anh trai. Do đó phải có mũi tên chỉ ra là bác thích con Y nhưng nó thì không

Trên thực tể thì một Graph chắc chắn phải có cả 2 trường hợp Directed và Undirected sảy ra trên cũng một Graph, mình cũng chả biết làm sao mà họ tách 2 cái để riêng. Chắc vậy cho dễ học 

Ví dụ Graph trong thực tế

Đang là hàng tá ví dụ của thằng Neo4j, anh em tham khảo nhé

https://neo4j.com/graphgists/

Biết Graph được gì

Mình bắt đầu đụng vào code từ năm lớp 6, tới giờ mình đang học năm 3 về ngành Khoa học máy tính. Trong suốt quãng thời gian từ lúc biết viết code tới tật khi nộp đơn vào Truờng Bách Khoa HCM (hối hận vl) thì mình chả biết Graph là gì cả mà vẫn code bình thường. Năm lớp 11 mình có code được một website thương mại điện tử/forum (không dùng Framework) và cũng chả cần biết Graph là gì cả. Thực sự tới giờ mình cũng không tin mình có thể code được một project như vậy 

Vậy đấy, theo mình, biết Graph hay không cũng không ảnh hưởng gì nhiều tới việc trở thành một lập trình viên cả. Nhưng nếu biết nó sẽ khiến các bác trở nên vĩ đại hơn , thông minh hơn , sang chảnh hơn ,…

Ứng dụng khi biết Graph

  • Biểu diễn mỗi quan hệ trong một mạng xã hội (Social Network)
  • Biểu diễn bản đổ, tìm đường đi ngắn nhất giữa các điểm trên biểu đồ,…
  • Khiến bạn trở nên sang chảnh hơn khi đi Phỏng vấn 

Ngoài ra, theo mình hiện tại Graph chưa đặt được dấu ấn của mình nhiều trong công nghiệp lập trình nhưng mọi thứ luôn phát triển, sau này, có lẽ Graph sẽ có một chỗ đứng vững chắc cho riêng mình 

Nhìn Facebook xem https://www.facebook.com/notes/facebook-engineering/tao-the-power-of-the-graph/10151525983993920/

Nhìn nguời ta đang chuyển từ REST API sang Graph

View story at Medium.com

https://0x2a.sh/from-rest-to-graphql-b4e95e94c26b#.qsq1ksosf

https://dev.to/reactiveconf/why-i-believe-graphql-will-come-to-replace-rest

Lưu một Database duới dạng Graph chứ không phải theo bảng/cột cũ rích nữa? https://neo4j.com

Nó giống như hồi xưa chỉ cần Function Programing là đủ để đáp ứng nhưng nó dần trở nên sida , OOP ra đời để thay thế nó 

Nếu như văn học phản ánh đúng xã hội khi nó được viết thì code cũng vậy. OOP đang phản ánh đúng xã hội mà loài người đang tồn tại.Bịa ra

Xây dựng một Graph

Thực ra mình có xây dựng một Directed Graph trong Series http://cuthanh.com/nodejs/xay-dung-he-thong-goi-y-phan-1 và lưu nó trên MongoDB. Sau này có thể mình sẽ thử trên Neo4j xem sao nhỉ, nếu các bác hứng thú?

…hoặc một cách triển khai khác

let MakeGraph = () => { 
  let graph = {};
  graph.contains = (node)=> {
    return !!graph[node];
  }
  graph.addVertex = (node) => {  
    if(!graph.contains(node)){
      graph[node] = {edges:{}};
    }
  }
  graph.removeVertex = (node) => {
    if(graph.contains(node)) {
      for(let connectedNode in graph[node].edges) {
        graph.removeEdge(node, connectedNode);
      }
      delete graph[node];
    }
  }
  graph.addEdge = (startNode, endNode) => {
    if(graph.contains(startNode) && graph.contains(endNode)){
      graph[startNode].edges[endNode] = true;
      graph[endNode].edges[startNode] = true;
    }
  }
  
  graph.removeEdge = (startNode, endNode) => {
    if(graph.contains(startNode) && graph.contains(endNode)){
      delete graph[startNode].edges[endNode]
      delete graph[endNode].edges[startNode]
    }
  }
  return graph;
}

Các bác xem qua đi nhé, em lười nói chi tiết quá! 

 

Hy vọng mọi người có cái nhìn với Graph một cách tốt hơn (giống như mình đã từng chả coi Graph ra gì cả ) và ứng dụng Graph vào những project sau này của mình nhé 

 

Like
Like Love Haha Wow Sad Angry
72
Comments

Leave a Comment