1
0
mirror of https://github.com/lana-k/sqliteviz.git synced 2025-12-06 18:18:53 +08:00

25 Commits

Author SHA1 Message Date
lana-k
c5fcddc29e Update Graph.md 2025-11-03 20:32:46 +01:00
lana-k
521662b271 minor changes 2025-11-02 13:45:23 +01:00
saaj
4a47e4ff0f Proofread 2025-11-02 12:54:18 +01:00
lana-k
86cd55ca9c Update How-to-get-result-set-suitable-for-graph-visualisation.md 2025-11-01 20:46:51 +01:00
lana-k
0da63acd60 Update Graph.md 2025-11-01 20:39:42 +01:00
lana-k
bf1bfb849c Update Graph.md 2025-11-01 20:38:50 +01:00
lana-k
83410560b3 Update How-to-get-result-set-suitable-for-graph-visualisation.md 2025-11-01 20:32:57 +01:00
lana-k
831364181d Add files via upload 2025-11-01 20:30:30 +01:00
lana-k
5015a9bed7 Update How-to-get-result-set-suitable-for-graph-visualisation.md 2025-11-01 20:29:50 +01:00
lana-k
07409a0e20 Update How-to-get-result-set-suitable-for-graph-visualisation.md 2025-11-01 20:10:28 +01:00
lana-k
ae39f9e66e Update Graph.md 2025-11-01 20:08:33 +01:00
lana-k
794c8dd491 Update How-to-get-result-set-suitable-for-graph-visualisation.md 2025-11-01 20:08:13 +01:00
lana-k
d6d563f039 Update Graph.md 2025-11-01 20:02:49 +01:00
lana-k
1bc46f3664 Update and rename How-to-get-result-set-suiltable-for-graph-visualisation.md to How-to-get-result-set-suitable-for-graph-visualisation.md 2025-11-01 20:02:22 +01:00
lana-k
ab623f566b Create How-to-get-result-set-suiltable-for-graph-visualisation.md 2025-11-01 20:01:12 +01:00
lana-k
5a375bc39f Update Graph.md 2025-11-01 20:00:19 +01:00
lana-k
ad3ff74b09 Update Graph.md 2025-10-31 22:53:14 +01:00
lana-k
c8c57e145e Add files via upload 2025-10-31 22:49:10 +01:00
lana-k
888b57e855 Update Graph.md 2025-10-31 22:35:53 +01:00
lana-k
3d5c21f6a2 Update Graph.md 2025-10-31 11:32:33 +01:00
lana-k
7e11ab810d Update Graph.md 2025-10-30 23:11:09 +01:00
lana-k
7656d7d263 Add files via upload 2025-10-30 20:34:51 +01:00
lana-k
f6bafce6aa Update Graph.md 2025-10-30 20:26:19 +01:00
lana-k
1b1fc24926 Update Graph.md 2025-10-30 20:25:43 +01:00
lana-k
77dcfd3691 Update Graph.md 2025-10-30 20:25:19 +01:00
7 changed files with 314 additions and 36 deletions

230
Graph.md
View File

@@ -1,54 +1,212 @@
# Graph # Graph
## Pivot table UI Sqliteviz supports graph (network) visualisation. To build a graph, first run a query to get data.
Then open the visualisation panel by clicking ![](./img/visualisation.svg)
in any of the two-side toolbars and choose the graph mode by clicking ![](./img/graph.svg).
Sqliteviz allows building pivot tables and visualizing them. To build a graph ## Requirements for result set
run a query to get data. Then open visualisation panel by clicking ![](./img/visualisation.svg)
in any of the two side toolbars and choose a pivot mode by clicking ![](./img/graph.svg).
A pivot visualisation has the following settings: To build a graph, a result set must follow the following requirements:
- Columns choose one or more column names from the result set. The values in - the first column must contain JSON documents (subsequent columns in the result set are ignored)
the chosen columns will be column names of the pivot table. - each JSON document has a key indicating whether the document represents a node/vertex (value `0`)
- Rows choose one or more column names from the result set. The values in the or an edge (value `1`)
chosen columns will be row names of the pivot table. - each JSON document representing a node has a key with the node/vertex id
- Order of columns and rows. - each JSON document representing an edge has a key with the edge source node/vertex and a key with
- Aggregator and its arguments a function which will be used for pivot cell the edge target node/vertex
calculation. An aggregator can have from zero to two arguments. An aggregator
argument is one of the columns of the result set.
- View pivot table visualisation. It can be a table, a heatmap, a chart,
etc. See some examples of different views of the same pivot table below.
![Fig. 1: Table](./img/Screenshot_pivot_table.png) That is what is the minimum required for a graph, but the JSON documents can have more fields used
in graph styling (read [Graph styling](#graph-styling)).
![Fig. 2: Heatmap](./img/Screenshot_pivot_heatmap.png) See also an example in [How to get a result set suitable for graph visualisation][1].
![Fig. 3: Horizontal Stacked Bar Chart](./img/Screenshot_pivot_barchart.png) ## Graph structure
There are several built-in chart views for a pivot. But you can build your own Start building a graph by setting a mapping from your documents to node and edge properties.
with `Custom chart` view (fig. 4). Go to `Structure` > `Graph` and set the following fields:
![Fig. 4: Custom Chart](./img/Screenshot_pivot_custom_chart.png) - Object type a field containing `0` for node documents and `1` for edge documents.
- Node Id a field containing the node identifier
- Edge source a field keeping a node identifier where the edge begins.
- Edge target a field keeping a node identifier where the edge ends.
> **Note:** You can switch to other pivot views and back to `Custom chart` This is already enough to build a graph with default styling and circular layout.
> all your custom chart settings will be remembered. But if you switch the
> visualisation mode from pivot to any other mode, unsaved changes will be lost.
You can save any visualisation as an image by clicking ![](./img/camera.svg). ![Fig. 1: Graph structure settings](./img/Screenshot_graph_structure.png)
## Pivot table SQL ## Graph styling
Pivot table (in the form of a result set) can be built on the SQL-level and, ### General
technically speaking, can be visualised as any other result set. Practically
though there are a couple of challenges with that:
1. Visualising a dataset of long/tall shape is much more convenient in Plotly Set a background color of the graph in `Style` > `General` panel.
(chart editor) rather than one of wide/fat shape.
2. SQLite doesn't have a special constructs like `PIVOT` or `CROSSTAB` in
its SQL dialect.
[How to build a pivot table in SQL(ite)][1] explores two options with static ### Nodes
(or beforehand-known) and dynamic columns.
[1]: ../How-to-build-a-pivot-table-in-SQ-Lite There are the following settings in `Style` > `Nodes` panel:
- Label - a field containing the node label. Note that if the graph has too many nodes or the node
size is too small, some labels can be visible only at a certain zoom level.
- Label Color - a color of node labels
- Size - set a node size. There are 3 modes of node sizing: constant, variable and calculated.
- `Constant` means that all nodes have the same given size.
- `Variable` allows you to choose a field where the node size is taken from.
- `Calculated` allows you to choose a method that is used to calculate the node size.
Currently, 3 methods are available: total node degree, degree by in-edges and
degree by out-edges.
For variable and calculated sizing it's also possible to set the scale, the minimum
size and the sizing mode - area or diameter. In the diameter mode the difference
between node sizes is more noticeable.
- Color - set a node color. There are 3 modes of node color: constant, variable and calculated.
- `Constant` means that all nodes have the same color.
- `Variable` allows you to choose a field by which the color is determined.
With this option you can also choose if the color value should be taken directly or mapped to a
color palette.
`Direct` mode means that in the JSON document representing the node, the value in the selected
field is used as a color. The color value in the JSON document can be set in different
ways:
1. As Hex, 8-digit (RGBA) Hex:
```
#000
000
#369C
369C
#f0f0f6
f0f0f6
#f0f0f688
f0f0f688
```
2. RGB, RGBA:
```
// As a string:
rgb(255, 0, 0)
rgb 255 0 0
rgba(255, 0, 0, .5)
// As a nested structure:
{ "r": 255, "g": 0, "b": 0 }
```
3. HSL, HSLA:
```
// As a string:
hsl(0, 100%, 50%)
hsla(0, 100%, 50%, .5)
hsl(0, 100%, 50%)
hsl 0 1.0 0.5
// As a nested structure:
{ "h": 0, "s": 1, "l": .5 }
```
4. HSV, HSVA:
```
// As a string:
hsv(0, 100%, 100%)
hsva(0, 100%, 100%, .5)
hsv(0 100% 100%)
hsv 0 1 1
// As a nested structure:
{ "h": 0, "s": 100, "v": 100 }
```
5. Named colors:
Case insensitive names are accepted, using the list of [colors in the CSS
spec][2].
```
RED
blanchedalmond
darkblue
```
When `Map to` option is selected, the value by the selected field can be anything because it
won't be used directly as a color. In this case each distinct value will be mapped to a certain
color, so nodes with the same value will have the same color. Click on a color palette to open a
palette selector.
`Calculated` color mode allows to choose a method that will be used to determine a color.
Currently, 3 methods are available: total node degree, degree by in-edges and degree by
out-edges. You can also choose a color palette that will be used in a mapping of calculated
values into an actual color.
- Color As - defines how color mapping should work - continuously or categorically.
Continuous mode is more suitable when the mapped values have a meaningful order. It looks more
informative with sequential palettes. In that case the lowest value corresponds to the first
color in the palette and the highest value - to the last color. The color of each intermediate
value reflects the position of that value in the range.
Categorical mode just uses the next color in the palette for each new distinct value.
- Colorscale Direction - use the selected palette as is or reverse it.
### Edges
There are the following settings in `Style` > `Edges` panel:
- Direction - show an edges with or without arrows
- Label - a field containing an edge label. Note that if the graph has too many edges,
some labels can be visible only at a certain zoom level.
- Label Color - a color of edge labels
- Size - set an edge thickness. There are 2 modes of edge sizing: constant and variable.
- `Constant` means that all edges have the same thickness.
- `Variable` allows you to choose a field where the edge size is taken from.
For variable sizing it's also possible to set the scale and the minimum size.
- Color - set an edge color. There are 2 modes of edge color: constant and variable. They work
similar to the node color modes.
- Color As - defines how color mapping should work - continuously or categorically, similar to the
node color setting.
- Colorscale Direction - use the selected palette as is or reverse it.
### Layout
#### Circular
In this layout all nodes are just placed along a circle.
#### Random
This layout places nodes randomly for each seed value. The seed value allows you to restore the
random layout you liked when you open the inquiry and run the query next time.
![Fig. 2: Random layout](./img/Screenshot_graph_random.png)
#### Circle pack
Arranges nodes as a bubble chart according to specified attributes. You can choose multiple
hierarchy attributes to group nodes.
![Fig. 3: Circle pack layout](./img/Screenshot_graph_circle_pack.png)
#### ForceAtlas2
A continuous graph layout algorithm. Read more details about the algorithm and its settings in the
[article][3]. The algorithm works iteratively. When you choose ForceAtlas2 layout or run the query,
it is automatically run 50 iterations of the algorithm. You can change the amount of steps run
automatically in `Initial Iterations`. You can also run and stop the algorithm manually by
clicking `Start`/`Stop` button.
![Fig. 3: ForceAtlas2 layout](./img/Screenshot_graph_force_atlas2.png)
[1]: ./How-to-get-result-set-suitable-for-graph-visualisation
[2]: https://www.w3.org/TR/css-color-4/#named-colors
[3]: https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0098679

View File

@@ -0,0 +1,120 @@
# How to get a result set suitable for graph visualisation
There are some [requirements for result sets][1] if you want to make a graph.
Here is an example of building a query that returns a result set appropriate for graph
visualisation.
Let's say, you have 2 tables:
1. `house`:
| name | points |
| ---------- | ------ |
| Gryffindor | 100 |
| Hufflepuff | 90 |
| Ravenclaw | 95 |
| Slytherin | 80 |
2. `student`:
| id | name | house |
| -- | -------------- | ---------- |
| 1 | Harry Potter | Gryffindor |
| 2 | Ron Weasley | Gryffindor |
| 3 | Draco Malfoy' | Slytherin |
| 4 | Luna Lovegood | Ravenclaw |
| 5 | Cedric Diggory | Hufflepuff |
Each student belongs to a certain house.
Let's say you want to build a graph with houses and students as nodes, where each house is linked
with its students.
We are going to use [json_object][2] function to form JSON documents. The result set should contain
both nodes and edges and we have to provide a field indicating if the document represents a node
(0) or and edge (1). Let's provide it as `object_type`:
```sql
SELECT json_object('object_type', 0)
FROM house
UNION ALL
SELECT json_object('object_type', 0)
FROM student
UNION ALL
SELECT json_object('object_type', 1)
FROM student
```
Note that we included `student` table twice. That is because the table contains not only students
but also their relationship to houses. So the records from the first union of `student` are used
as nodes and from the second one - as edges.
Then we need to provide an ID for each node. Let's put it in `node_id` field. The `node_id` value
for students is taken from `id` column and for houses - from `name`:
```sql
SELECT json_object('object_type', 0, 'node_id', name)
FROM house
UNION ALL
SELECT json_object('object_type', 0, 'node_id', id)
FROM student
UNION ALL
SELECT json_object('object_type', 1)
FROM student
```
Each edge document must provide a node id where the edge begins and where it ends. Let's put it in
`source` and `target`:
```sql
SELECT json_object('object_type', 0, 'node_id', name)
FROM house
UNION ALL
SELECT json_object('object_type', 0, 'node_id', id)
FROM student
UNION ALL
SELECT json_object('object_type', 1, 'source', house, 'target', id)
FROM student
```
Basically, that is enough to build a graph. But it is not very meaningful without labels.
Also, it would be nice to distinguish house nodes from student nodes by color.
Let's put additional fields `label` and `type` that can be used in graph styling.
```sql
SELECT json_object('object_type', 0, 'node_id', name, 'label', name, 'type', 'house') AS graph_object
FROM house
UNION ALL
SELECT json_object('object_type', 0, 'node_id', id, 'label', name, 'type', 'student')
FROM student
UNION ALL
SELECT json_object('object_type', 1, 'source', house, 'target', id)
FROM student
```
Run the query, the result set will look like this:
| graph_object |
| ------------------------------------------------------------------------------ |
| {"object_type":0,"node_id":"Gryffindor","label":"Gryffindor","type":"house"} |
| {"object_type":0,"node_id":"Hufflepuff","label":"Hufflepuff","type":"house"} |
| {"object_type":0,"node_id":"Ravenclaw","label":"Ravenclaw","type":"house"} |
| {"object_type":0,"node_id":"Slytherin","label":"Slytherin","type":"house"} |
| {"object_type":0,"node_id":1,"label":"Harry Potter","type":"student"} |
| {"object_type":0,"node_id":2,"label":"Ron Weasley","type":"student"} |
| {"object_type":0,"node_id":3,"label":"Draco Malfoy","type":"student"} |
| {"object_type":0,"node_id":4,"label":"Luna Lovegood","type":"student"} |
| {"object_type":0,"node_id":5,"label":"Cedric Diggory","type":"student"} |
| {"object_type":1,"node_source":"Gryffindor","target":1} |
| {"object_type":1,"node_source":"Gryffindor","target":2} |
| {"object_type":1,"node_source":"Slytherin","target":3} |
| {"object_type":1,"node_source":"Ravenclaw","target":4} |
| {"object_type":1,"node_source":"Hufflepuff","target":5} |
Now in the graph editor, we can set mapping of the result set documents into node and edge
properties, set graph styles and get the following visualisation:
![Fig. 1: Graph visualisation example](./img/Screenshot_potter_example.png)
[1]: ./graph#requirements-for-result-set
[2]: https://sqlite.org/json1.html#jobj

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB