Fork of https://github.com/oxigraph/oxigraph.git for the purpose of NextGraph project
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.3 KiB
112 lines
3.3 KiB
//! Store implementations
|
|
|
|
mod memory;
|
|
pub(crate) mod numeric_encoder;
|
|
#[cfg(feature = "rocksdb")]
|
|
mod rocksdb;
|
|
#[cfg(feature = "sled")]
|
|
mod sled;
|
|
|
|
use crate::sparql::GraphPattern;
|
|
pub use crate::store::memory::MemoryStore;
|
|
pub use crate::store::memory::MemoryTransaction;
|
|
#[cfg(feature = "rocksdb")]
|
|
pub use crate::store::rocksdb::RocksDbStore;
|
|
#[cfg(feature = "rocksdb")]
|
|
pub use crate::store::rocksdb::RocksDbTransaction;
|
|
#[cfg(feature = "sled")]
|
|
pub use crate::store::sled::SledStore;
|
|
|
|
use crate::model::*;
|
|
use crate::store::numeric_encoder::*;
|
|
use crate::{DatasetSyntax, Error, GraphSyntax, Result};
|
|
use rio_api::parser::{QuadsParser, TriplesParser};
|
|
use rio_turtle::{NQuadsParser, NTriplesParser, TriGParser, TurtleParser};
|
|
use rio_xml::RdfXmlParser;
|
|
use std::collections::HashMap;
|
|
use std::io::BufRead;
|
|
use std::iter::Iterator;
|
|
|
|
pub trait ReadableEncodedStore: StrLookup + Sized {
|
|
fn encoded_quads_for_pattern<'a>(
|
|
&'a self,
|
|
subject: Option<EncodedTerm>,
|
|
predicate: Option<EncodedTerm>,
|
|
object: Option<EncodedTerm>,
|
|
graph_name: Option<EncodedTerm>,
|
|
) -> Box<dyn Iterator<Item = Result<EncodedQuad>> + 'a>;
|
|
}
|
|
|
|
pub trait WritableEncodedStore: StrContainer + Sized {
|
|
fn insert_encoded(&mut self, quad: &EncodedQuad) -> Result<()>;
|
|
|
|
fn remove_encoded(&mut self, quad: &EncodedQuad) -> Result<()>;
|
|
}
|
|
|
|
fn load_graph<S: WritableEncodedStore>(
|
|
store: &mut S,
|
|
reader: impl BufRead,
|
|
syntax: GraphSyntax,
|
|
to_graph_name: Option<&NamedOrBlankNode>,
|
|
base_iri: Option<&str>,
|
|
) -> Result<()> {
|
|
let base_iri = base_iri.unwrap_or("");
|
|
match syntax {
|
|
GraphSyntax::NTriples => {
|
|
load_from_triple_parser(store, NTriplesParser::new(reader)?, to_graph_name)
|
|
}
|
|
GraphSyntax::Turtle => {
|
|
load_from_triple_parser(store, TurtleParser::new(reader, base_iri)?, to_graph_name)
|
|
}
|
|
GraphSyntax::RdfXml => {
|
|
load_from_triple_parser(store, RdfXmlParser::new(reader, base_iri)?, to_graph_name)
|
|
}
|
|
}
|
|
}
|
|
|
|
fn load_from_triple_parser<S: WritableEncodedStore, P: TriplesParser>(
|
|
store: &mut S,
|
|
mut parser: P,
|
|
to_graph_name: Option<&NamedOrBlankNode>,
|
|
) -> Result<()>
|
|
where
|
|
Error: From<P::Error>,
|
|
{
|
|
let mut bnode_map = HashMap::default();
|
|
let graph_name = if let Some(graph_name) = to_graph_name {
|
|
store.encode_named_or_blank_node(graph_name)?
|
|
} else {
|
|
EncodedTerm::DefaultGraph
|
|
};
|
|
parser.parse_all(&mut move |t| {
|
|
let quad = store.encode_rio_triple_in_graph(t, graph_name, &mut bnode_map)?;
|
|
store.insert_encoded(&quad)
|
|
})
|
|
}
|
|
|
|
fn load_dataset<S: WritableEncodedStore>(
|
|
store: &mut S,
|
|
reader: impl BufRead,
|
|
syntax: DatasetSyntax,
|
|
base_iri: Option<&str>,
|
|
) -> Result<()> {
|
|
let base_iri = base_iri.unwrap_or("");
|
|
match syntax {
|
|
DatasetSyntax::NQuads => load_from_quad_parser(store, NQuadsParser::new(reader)?),
|
|
DatasetSyntax::TriG => load_from_quad_parser(store, TriGParser::new(reader, base_iri)?),
|
|
}
|
|
}
|
|
|
|
fn load_from_quad_parser<S: WritableEncodedStore, P: QuadsParser>(
|
|
store: &mut S,
|
|
mut parser: P,
|
|
) -> Result<()>
|
|
where
|
|
Error: From<P::Error>,
|
|
{
|
|
let mut bnode_map = HashMap::default();
|
|
parser.parse_all(&mut move |q| {
|
|
let quad = store.encode_rio_quad(q, &mut bnode_map)?;
|
|
store.insert_encoded(&quad)
|
|
})
|
|
}
|
|
|