--- title: "Getting Started with roxigraph" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Getting Started with roxigraph} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` ## Introduction **roxigraph** provides RDF storage and SPARQL query capabilities for R by wrapping the [Oxigraph](https://github.com/oxigraph/oxigraph) graph database. This vignette introduces the core functionality. ## Creating an RDF Store ```{r setup} library(roxigraph) # Create an in-memory store store <- rdf_store() ``` For persistent storage that survives R sessions: ```{r eval=FALSE} store <- rdf_store("/path/to/database") ``` ## Loading RDF Data roxigraph supports multiple RDF serialization formats: ### Turtle ```{r} turtle_data <- ' @prefix foaf: . @prefix ex: . ex:alice a foaf:Person ; foaf:name "Alice" ; foaf:age 30 ; foaf:knows ex:bob . ex:bob a foaf:Person ; foaf:name "Bob" ; foaf:age 25 . ' rdf_load(store, turtle_data, format = "turtle") rdf_size(store) ``` ### N-Triples ```{r} store2 <- rdf_store() nt_data <- ' "object" .' rdf_load(store2, nt_data, format = "ntriples") ``` ### From Files ```{r eval=FALSE} rdf_load_file(store, "data.ttl", format = "turtle") rdf_load_file(store, "data.nt") # Format guessed from extension ``` ## SPARQL Queries ### SELECT Queries ```{r} # Find all people and their names results <- sparql_query(store, " PREFIX foaf: SELECT ?person ?name WHERE { ?person a foaf:Person ; foaf:name ?name . } ") results ``` ### Filtering and Sorting ```{r} # Find people over 26 sparql_query(store, " PREFIX foaf: SELECT ?name ?age WHERE { ?person foaf:name ?name ; foaf:age ?age . FILTER(?age > 26) } ORDER BY DESC(?age) ") ``` ### ASK Queries ```{r} # Check if Alice exists sparql_query(store, " PREFIX ex: ASK { ex:alice ?p ?o } ") ``` ### Aggregation ```{r} sparql_query(store, " PREFIX foaf: SELECT (COUNT(?person) as ?count) (AVG(?age) as ?avg_age) WHERE { ?person a foaf:Person ; foaf:age ?age . } ") ``` ## Modifying Data ### SPARQL Update ```{r} # Add new data sparql_update(store, " PREFIX foaf: PREFIX ex: INSERT DATA { ex:carol a foaf:Person ; foaf:name 'Carol' ; foaf:age 28 . } ") rdf_size(store) ``` ### Direct Triple Manipulation ```{r} # Add a triple rdf_add( store, "", "", "" ) # Remove a triple rdf_remove( store, "", "", "" ) ``` ## Serialization Export your RDF data: ```{r} # Export to N-Quads format output <- rdf_serialize(store, format = "nquads") cat(substr(output, 1, 500), "...\n") ``` Supported output formats: `nquads`, `trig`, `rdfxml` ## Best Practices 1. **Use prefixes** in SPARQL queries for readability 2. **Choose the right storage**: In-memory for temporary data, persistent for large datasets 3. **Batch operations**: Use `rdf_load()` for bulk data rather than individual `rdf_add()` calls 4. **Close persistent stores**: R will handle cleanup, but explicit management helps with large databases ## Further Reading - [SPARQL 1.1 Query Language](https://www.w3.org/TR/sparql11-query/) - [SPARQL 1.1 Update](https://www.w3.org/TR/sparql11-update/) - [Turtle - RDF 1.1](https://www.w3.org/TR/turtle/) - [Oxigraph Documentation](https://github.com/oxigraph/oxigraph)