Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Closure table equivalent for graph structures in SQL

This question How to store tree structure in sql? lead to the idea of a Closure table for storing trees that is optimal in many ways.

enter image description here enter image description here

The question is is there something along these lines for graph structures in SQL. I saw this paper which seems to outline a graph index structure but it's a bit over my head. Wondering if there is a sort of way to create a few auxiliary tables to handle common queries on graph data in SQL.

like image 349
Lance Avatar asked Apr 06 '18 20:04

Lance


People also ask

What is a closure table SQL?

Closure tables are plain ordinary relational tables that are designed to work easily with relational operations. It is true that useful extensions are provided for SQL Server to deal with hierarchies.

Do graph databases use SQL?

Graph databases use the same table structures found in traditional SQL Server databases and support the same tools and T-SQL statements, but they also include features for storing and navigating complex relationships. This article is the first in a series about SQL Server graph databases.

What is a graph table in SQL?

SQL Graph Database A graph is a collection of node and edge tables. Node or edge tables can be created under any schema in the database, but they all belong to one logical graph. A node table is collection of similar type of nodes. For example, a Person node table holds all the Person nodes belonging to a graph.

How do you create a graph in SQL?

Just select a database, type an sql query & click Run Query. Chart Preview will render your chart. You will see charts being generated on the fly. Change type of chart by clicking on the list of chart types below the boxes (Table, Line, Bar, etc).


1 Answers

I did the presentation you linked to, and I've been asked about implementing general graphs with a similar method, but I've never gotten around to it.

Certainly there are problems with the technique if you have cyclic graphs, unless you can unambiguously identify a "starting node." Because otherwise if you start with any node in a cycle, you'd want to be able to traverse the whole cycle in the graph.

It might be easier in SQL using a recursive CTE, but I most often use MySQL which doesn't support CTE syntax until version 8.0. And if you do have recursive CTE capability, you'd be better off using that instead of a closure table, because you have less chance for data anomalies.

Another option is to explore a specialized graph database. For MySQL/MariaDB, there's a community storage engine that optimizes for tree and graph queries: https://openquery.com.au/products/graph-engine

like image 55
Bill Karwin Avatar answered Nov 20 '22 08:11

Bill Karwin