The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Graph Library Integrations

Introduction

This vignette demonstrates how to convert Kuzu query results into various R graph library objects, including igraph, tidygraph, and g6R. It showcases the seamless integration of kuzuR with popular R packages for graph analysis and visualization.

Converting to igraph

The igraph package is a powerful tool for graph manipulation and analysis in R. kuzuR provides a direct conversion function as_igraph() to transform Kuzu query results into igraph objects.

Example: Loading and Converting Graph Data

First, let’s set up a Kuzu database and load some sample graph data.

library(kuzuR)
library(igraph)
#> 
#> Attaching package: 'igraph'
#> The following objects are masked from 'package:stats':
#> 
#>     decompose, spectrum
#> The following object is masked from 'package:base':
#> 
#>     union

# Create a connection
db_path <- tempfile()
con <- kuzu_connection(db_path)

# Create schema for nodes and relationships
kuzu_execute(con, paste("CREATE NODE TABLE Person(name STRING, age INT64,",
                        "PRIMARY KEY (name))"))
#> <kuzu.query_result.QueryResult object at 0x0000018D82059130>
kuzu_execute(con, "CREATE REL TABLE Knows(FROM Person TO Person, since INT64)")
#> <kuzu.query_result.QueryResult object at 0x0000018D82060270>

# Prepare data frames
persons_data <- data.frame(
  name = c("Alice", "Bob", "Carol"),
  age = c(35, 45, 25)
)

knows_data <- data.frame(
  from_person = c("Alice", "Bob"),
  to_person = c("Bob", "Carol"),
  since = c(2010, 2015)
)

# Load data into Kuzu
kuzu_copy_from_df(con, persons_data, "Person")
kuzu_copy_from_df(con, knows_data, "Knows")

Now, let’s execute a query that returns graph data and convert it to an igraph object.

# Query to get all persons and their relationships
graph_query_result <- kuzu_execute(con, paste("MATCH (p1:Person)-[k:Knows]->",
                                              "(p2:Person) RETURN p1, p2, k"))

# Convert the Kuzu result to an igraph object
igraph_graph <- as_igraph(graph_query_result)

# Print the igraph object summary
print(igraph_graph)
#> IGRAPH 0e2d223 DN-- 3 2 -- 
#> + attr: name (v/c), age (v/n), Person (v/l), label (v/c), _dst (e/x),
#> | since (e/n), _label (e/c), _id (e/x), _src (e/x)
#> + edges from 0e2d223 (vertex names):
#> [1] Person_Alice->Person_Bob   Person_Bob  ->Person_Carol

V(igraph_graph)$label <- igraph::V(igraph_graph)$name
E(igraph_graph)$label <- "knows"
plot(igraph_graph)

You can now perform standard igraph operations on igraph_graph.

Converting to tidygraph

The tidygraph package offers a tidy data approach to graph manipulation, integrating seamlessly with the tidyverse. kuzuR supports conversion to tidygraph objects via as_tidygraph().

Example: Converting to tidygraph

Using the same Kuzu query result, we can convert it to a tidygraph object.

# Convert the Kuzu result to a tidygraph object
tidygraph_graph <- as_tidygraph(graph_query_result)

# Print the tidygraph object summary
print(tidygraph_graph)
#> # A tbl_graph: 3 nodes and 2 edges
#> #
#> # A rooted tree
#> #
#> # Node Data: 3 × 4 (active)
#>   name           age Person label 
#>   <chr>        <dbl> <lgl>  <chr> 
#> 1 Person_Alice    35 TRUE   Person
#> 2 Person_Bob      45 TRUE   Person
#> 3 Person_Carol    25 TRUE   Person
#> #
#> # Edge Data: 2 × 7
#>    from    to `_dst`           since `_label` `_id`            `_src`          
#>   <int> <int> <list>           <dbl> <chr>    <list>           <list>          
#> 1     1     2 <named list [2]>  2010 Knows    <named list [2]> <named list [2]>
#> 2     2     3 <named list [2]>  2015 Knows    <named list [2]> <named list [2]>
plot(tidygraph_graph)

Interactive Visualization with g6R

The g6R package provides an R interface to the G6 JavaScript graph visualization library, enabling rich, interactive visualizations directly within R environments. Since g6R has built-in support for igraph objects, you can easily create interactive visualizations by first converting your Kuzu query result to an igraph object.

Example: Creating an Interactive g6R Graph

Building on the previous examples, we can convert the Kuzu query result into a g6R object. We can then customize the appearance of the nodes and edges for a more informative visualization.

library(g6R)
#> 
#> Attaching package: 'g6R'
#> The following object is masked from 'package:graphics':
#> 
#>     legend
#> The following object is masked from 'package:utils':
#> 
#>     history
graph_query_result <- kuzu_execute(con, paste("MATCH (p1:Person)-[k:Knows]->",
                                              "(p2:Person) RETURN p1, p2, k"))
# Convert the Kuzu result to a g6R-compatible list
igraph_graph <- as_igraph(graph_query_result)

g6 <- g6_igraph(igraph_graph) |>
  g6_layout(d3_force_layout()) |>
  g6_options(
    animation = FALSE,
    node = list(
      style = list(
        labelText = JS("(d) => d.name")
      )
    ),
    edge = list(
      style = list(
        endArrow = TRUE,
        labelText = JS("(d) => d.data.label")
      )
    )
  ) |>
  g6_behaviors(
    zoom_canvas(),
    collapse_expand(),
    drag_canvas(),
    drag_element()
  ) |>
  g6_plugins("toolbar")


# Display the graph
g6

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.