sophia_turtle/parser/
gnq.rs1use rio_turtle::GeneralizedNQuadsParser as RioGNQParser;
5use sophia_api::parser::QuadParser;
6use sophia_rio::parser::*;
7use std::io::BufRead;
8
9#[derive(Clone, Debug, Default)]
11pub struct GNQuadsParser {}
12
13impl<B: BufRead> QuadParser<B> for GNQuadsParser {
14 type Source = GeneralizedRioSource<RioGNQParser<B>>;
15 fn parse(&self, data: B) -> Self::Source {
16 GeneralizedRioSource(RioGNQParser::new(data))
17 }
18}
19
20sophia_api::def_mod_functions_for_bufread_parser!(GNQuadsParser, QuadParser);
21
22#[cfg(test)]
27mod test {
28 use super::*;
29 use sophia_api::dataset::Dataset;
30 use sophia_api::ns::rdf;
31 use sophia_api::quad::Spog;
32 use sophia_api::source::QuadSource;
33 use sophia_api::term::{SimpleTerm, TermKind};
34 use sophia_iri::Iri;
35 use std::collections::HashSet;
36
37 type MyDataset = Vec<Spog<SimpleTerm<'static>>>;
38
39 #[test]
40 fn test_simple_gnq_string() -> std::result::Result<(), Box<dyn std::error::Error>> {
41 let nq = r#"
42 <http://localhost/ex#me> <http://example.org/ns/knows> _:b1.
43 _:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/ns/Person> <tag:g1>.
44 _:b1 <http://example.org/ns/name> "Alice" <tag:g1>.
45 << <http://localhost/ex#me> <http://example.org/ns/knows> _:b1 >> <http://example.org/ns/since> "2002"^^<http://www.w3.org/2001/XMLSchema#integer>.
46 "#;
47
48 let mut d = MyDataset::new();
49 let p = GNQuadsParser {};
50 let c = p.parse_str(nq).add_to_dataset(&mut d)?;
51 assert_eq!(c, 4);
52 assert_eq!(
53 d.quads_matching(
54 [Iri::new_unchecked("http://localhost/ex#me")],
55 [Iri::new_unchecked("http://example.org/ns/knows")],
56 TermKind::BlankNode,
57 [None as Option<&SimpleTerm>],
58 )
59 .count(),
60 1
61 );
62 assert_eq!(
63 d.quads_matching(
64 TermKind::BlankNode,
65 [&rdf::type_],
66 [Iri::new_unchecked("http://example.org/ns/Person")],
67 [Some(Iri::new_unchecked("tag:g1"))],
68 )
69 .count(),
70 1
71 );
72 assert_eq!(
73 d.quads_matching(
74 TermKind::BlankNode,
75 [Iri::new_unchecked("http://example.org/ns/name")],
76 ["Alice"],
77 [Some(Iri::new_unchecked("tag:g1"))],
78 )
79 .count(),
80 1
81 );
82 assert_eq!(
83 d.quads_matching(
84 (
85 [Iri::new_unchecked("http://localhost/ex#me")],
86 [Iri::new_unchecked("http://example.org/ns/knows")],
87 TermKind::BlankNode,
88 ),
89 [Iri::new_unchecked("http://example.org/ns/since")],
90 [2002],
91 [None as Option<&SimpleTerm>],
92 )
93 .count(),
94 1
95 );
96 assert_eq!(d.blank_nodes().collect::<HashSet<_>>().len(), 1);
97 Ok(())
98 }
99}