#rdf #sophia #serialization #parser #parse

rdf_dynsyn

本包提供与 Sophia 兼容且基于 Sophia 的 RDF 解析器/序列化器,可以在运行时动态地对支持的任何语法进行实例化。

7 个版本

0.3.1 2023 年 9 月 28 日
0.3.0 2023 年 9 月 28 日
0.2.1 2022 年 9 月 28 日
0.2.0 2022 年 8 月 12 日
0.1.0 2022 年 1 月 25 日

#16 in #rdf

Download history 38/week @ 2024-04-22 27/week @ 2024-04-29 37/week @ 2024-05-06 31/week @ 2024-05-13 33/week @ 2024-05-20 45/week @ 2024-05-27 28/week @ 2024-06-03 28/week @ 2024-06-10 21/week @ 2024-06-17 31/week @ 2024-06-24 15/week @ 2024-07-08 56/week @ 2024-07-15 19/week @ 2024-07-22 59/week @ 2024-07-29 29/week @ 2024-08-05

163 每月下载量
用于 12 个包 (7 直接)

MIT/Apache

160KB
3.5K SLoC

rdf_dynsyn

本包提供与 Sophia 兼容且基于 Sophia 的 RDF 解析器/序列化器,可以在运行时动态地对支持的任何语法进行实例化。

为什么?

尽管 Sophia 为每种语法提供了专门的解析器/序列化器,但我们在代码时间必须知道文档语法才能实际使用它们。在许多网页情况下,我们可能只有在运行时才知道文档的语法,例如从内容类型、文件扩展名等。由于每个专门的解析器将解析到相应的流类型等,因此在这样的动态情况下与它们一起工作将会很困难。为了处理这种情况,本包提供了经过良好测试的抽象,这些抽象可以集成到 Sophia 生态系统。

入门

以下是一个简短的示例,说明如何从媒体类型/文件扩展名获取语法,实例化检测到的语法的解析器,解析内容,修改它并将其序列化回所需的语法。还可以查看更多示例。

use std::{collections::HashSet, str::FromStr};

use mime::Mime;
use sophia_api::{
    graph::MutableGraph,
    ns::Namespace,
    parser::TripleParser,
    serializer::{Stringifier, TripleSerializer},
    source::TripleSource,
    term::SimpleTerm,
};

use gdp_rs::proven::TryProven;
use rdf_dynsyn::{
    correspondence::Correspondent, parser::triples::*, serializer::triples::*, syntax::RdfSyntax,
};

pub fn try_main() -> Result<(), Box<dyn std::error::Error>> {
    //  let's say following are input params we got dynamically.
    // source media_type, content of source doc, and target media_type
    let src_doc_media_type = "text/turtle";
    let tgt_doc_media_type = "application/rdf+xml";
    let src_doc_content = r#"
        @prefix : <http://example.org/>.
        @prefix foaf: <http://xmlns.com/foaf/0.1/>.

        :alice foaf:name "Alice";
            foaf:mbox <mailto:[email protected]> .

        :bob foaf:name "Bob".
    "#;

    // resolve syntaxes for media_types. Or one can use static constants exported by `syntax` module,
    let src_doc_syntax =
        Correspondent::<RdfSyntax>::try_from(&Mime::from_str(src_doc_media_type)?)?.value;
    let tgt_doc_syntax =
        Correspondent::<RdfSyntax>::try_from(&Mime::from_str(tgt_doc_media_type)?)?.value;

    // get parser for source syntax
    let parser_factory = DynSynTripleParserFactory::default();
    let parser = parser_factory.new_parser(src_doc_syntax.try_proven()?, None);

    // parse to a graph
    let mut graph: HashSet<[SimpleTerm; 3]> =
        parser.parse_str(src_doc_content).collect_triples()?;

    let ex = Namespace::new("http://example.org/")?;
    let foaf = Namespace::new("http://xmlns.com/foaf/0.1/")?;

    // mutate graph
    graph.insert_triple([&ex.get("bob")?, &foaf.get("knows")?, &ex.get("alice")?])?;

    // get serializer for target syntax
    let serializer_factory = DynSynTripleSerializerFactory::new(None); // Here we can pass optional formatting options. see documentation.

    let mut serializer = serializer_factory.new_stringifier(tgt_doc_syntax.try_proven()?);
    let serialized_doc = serializer.serialize_graph(&graph)?.as_str();

    println!("The resulting graph\n{}", serialized_doc);

    Ok(())
}
fn main() {
    try_main().unwrap();
}

许可证:MIT OR Apache-2.0

依赖关系

~4–7.5MB
~136K SLoC