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