## ----setup, include = FALSE--------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) skip_vignette <- !reticulate::py_module_available("kuzu") ## ----eval=!skip_vignette------------------------------------------------------ library(kuzuR) con <- kuzu_connection(":memory:") ## ----eval=!skip_vignette------------------------------------------------------ # Create a node table for users with various data types kuzu_execute(con, paste("CREATE NODE TABLE User(userID UUID, name STRING,", "age INT64, is_active BOOL, created_at TIMESTAMP,", "last_login DATE, notes STRING[],", "PRIMARY KEY (userID))")) # Create a node table for products kuzu_execute(con, "CREATE NODE TABLE Product(productID INT64, name STRING, PRIMARY KEY (productID))") # Create a relationship table for user purchases kuzu_execute(con, "CREATE REL TABLE Buys(FROM User TO Product, purchase_date DATE)") ## ----eval=!skip_vignette------------------------------------------------------ library(jsonlite) # Create data frames for nodes and relationships users <- data.frame( userID = c("a1b2c3d4-e5f6-7890-1234-567890abcdef", "b2c3d4e5-f6a7-8901-2345-67890abcdef0"), name = c("Alice", "Bob"), age = c(35, 45), is_active = c(TRUE, FALSE), created_at = as.POSIXct(c("2023-01-15 10:30:00", "2022-11-20 14:00:00")), last_login = as.Date(c("2023-10-25", "2023-09-30")), stringsAsFactors = FALSE ) # LIST types should be formatted as JSON strings users$notes <- c(toJSON(c("note1", "note2")), toJSON("note3")) products <- data.frame( productID = c(101, 102), name = c("Laptop", "Mouse") ) buys <- data.frame( from_user = c("a1b2c3d4-e5f6-7890-1234-567890abcdef", "b2c3d4e5-f6a7-8901-2345-67890abcdef0"), to_product = c(101, 102), purchase_date = as.Date(c("2023-02-20", "2023-03-15")) ) # Load data into Kuzu kuzu_copy_from_df(con, users, "User") kuzu_copy_from_df(con, products, "Product") kuzu_copy_from_df(con, buys, "Buys") ## ----eval=!skip_vignette------------------------------------------------------ # Create a CSV file in the project's root directory csv_filename <- "products.csv" write.csv(data.frame(productID = c(103, 104), name = c("Keyboard", "Monitor")), csv_filename, row.names = FALSE) # Load data from the CSV file using just the filename kuzu_copy_from_csv(con, csv_filename, "Product") # Clean up the created file unlink(csv_filename) ## ----eval=!skip_vignette------------------------------------------------------ # Execute a query to get users and their purchases query_result <- kuzu_execute(con, "MATCH (u:User)-[b:Buys]->(p:Product) RETURN u.name, p.name, b.purchase_date") ## ----eval=!skip_vignette------------------------------------------------------ # Convert to a data frame df_result <- as.data.frame(query_result) print(df_result) # Convert to a tibble library(tibble) tibble_result <- as_tibble(query_result) print(tibble_result) ## ----eval=!skip_vignette------------------------------------------------------ query_result <- kuzu_execute(con, "MATCH (u:User)-[b:Buys]->(p:Product) RETURN u.name, p.name, b.purchase_date") result <- kuzu_get_all(query_result) print(result) # only fetch 1. result query_result <- kuzu_execute(con, "MATCH (u:User)-[b:Buys]->(p:Product) RETURN u.name, p.name, b.purchase_date") result <- kuzu_get_n(query_result, 1) print(result) #Fetch next result result <- kuzu_get_next(query_result) print(result) ## ----eval=!skip_vignette------------------------------------------------------ # Execute a query that returns a graph structure graph_query_result <- kuzu_execute(con, "MATCH (u:User)-[b:Buys]->(p:Product) RETURN u, p, b") igraph_obj <- as_igraph(graph_query_result) print(igraph_obj) plot(igraph_obj) # Convert to a tidygraph object tidygraph_obj <- as_tidygraph(graph_query_result) print(tidygraph_obj) plot(tidygraph_obj)