sophia_turtle/parser/
nq.rs

1//! Adapter for the [N-Quads] parser from [RIO](https://github.com/Tpt/rio/blob/master/turtle/src/nquads.rs)
2//!
3//! [N-Quads]: https://www.w3.org/TR/n-quads/
4use rio_turtle::NQuadsParser as RioNQParser;
5use sophia_api::parser::QuadParser;
6use sophia_rio::parser::*;
7use std::io::BufRead;
8
9/// N-Quads parser based on RIO.
10#[derive(Clone, Debug, Default)]
11pub struct NQuadsParser {}
12
13impl<B: BufRead> QuadParser<B> for NQuadsParser {
14    type Source = StrictRioSource<RioNQParser<B>>;
15    fn parse(&self, data: B) -> Self::Source {
16        StrictRioSource(RioNQParser::new(data))
17    }
18}
19
20sophia_api::def_mod_functions_for_bufread_parser!(NQuadsParser, QuadParser);
21
22// ---------------------------------------------------------------------------------
23//                                      tests
24// ---------------------------------------------------------------------------------
25
26#[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_nq_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 = NQuadsParser {};
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}