MoonTTL is a high-performance RDF parsing and serialization library for MoonBit.
{
"name": "your_username/your_project",
"deps": [
"thy1016/moonttl"
]
}moon run src/cmd/main -- "<http://example.org/s> <http://example.org/p> <http://example.org/o> ."echo '<http://example.org/s> <http://example.org/p> <http://example.org/o> .' > test.nq
moon run src/cmd/main -- -f test.nqmoon run src/cmd/main -- -v -f test.nq<http://example.org/s> <http://example.org/p> <http://example.org/o> .
let content = "<http://example.org/s> <http://example.org/p> <http://example.org/o> .\n"
let data = @utf8.encode(content).to_array()
let lexer = @lib.Lexer::Lexer(
@lib.RdfLexer::RdfLexer(@lib.RdfMode::NTriples, false, []),
data,
true,
@lib.MIN_BUFFER_SIZE,
@lib.MAX_BUFFER_SIZE,
Some(b"#"),
0,
0,
)
let logger = @lib.make_console_logger()
let machine = @lib.NQuadsRecognizer::{
current_state: @lib.NQuadsState::ExpectSubject,
stack: [@lib.NQuadsState::ExpectSubject],
emit_quad: false,
temp_literal: None,
lenient: false,
debug_logger: logger,
last_range: @lib.Range::default(),
errors: [],
}
let context = @lib.RdfContext::NQuadsRecognizerContext(@lib.NQuadsRecognizerContext::{
with_graph_name: true,
lexer_options: { base_iri: None },
})
let generic_machine = @lib.GenericStateMachine::GenericStateMachine(
machine,
context,
debug_logger=logger,
)
let parser = @lib.Parser::{
lexer,
engine: generic_machine,
context,
errors: [],
}
for ;; {
match parser.parse_next() {
Some(Ok(quad)) => println("Parsed: \{quad}")
Some(Err(e)) => println("Error: \{e}")
None => break
}
}src/
├── lexer_*.mbt # 词法分析器
├── parser_*.mbt # 语法分析器
├── iri.mbt # IRI 处理
├── literal.mbt # 字面量处理
├── langtag.mbt # 语言标签处理
└── tests/ # 测试文件moon run src/examples/nquads 实现 解析时间 每秒解析 每条耗时
━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━ ━━━━━━━━━━━ ━━━━━━━━━━━
MoonTTL (MoonBit) 1.76 ms 568,612 0.0018 ms
──────────────────── ────────── ─────────── ───────────
Oxigraph (Rust) 2.00 ms 500,000 0.0020 ms
──────────────────── ────────── ─────────── ───────────
rdflib (Python) 17.89 ms 55,900 0.0179 ms
──────────────────── ────────── ─────────── ───────────
Apache Jena (Java) 2,734 ms 36,576 0.0273 ms
──────────────────── ────────── ─────────── ───────────
no-brain-scan (C) 0.16 ms 6,250,000 0.0002 ms
### MoonTTL 性能分析
=== MoonBit 解析 test_1000.nq ===
文件: test_1000.nq
文件大小: 103670 bytes
=== 性能数据 ===
Lexer: 515.532 µs (5000 tokens)
ParserE: 575.14 µs (1000 quads)
验证: 1448.353 µs (1000 quads, 0 errors)
物化: 310.314 µs (1000 quads, 0 errors)
=== 总计 ===
总时间: 1.76 ms
三元组数量: 1000
每秒解析: 568,612
每三元组: 0.0018 ms
cd src/benchmark
./run_all.shtest {
let x = @ref.Ref(42)
@test.assert_eq(x.val, 42)
x.val = 100
@test.assert_eq(x.val, 100)
}pub trait DebugLogger {
fn info(Self, String) -> Unit
fn error(Self, String) -> Unit
fn warn(Self, String) -> Unit
}pub trait ErrOut {
fn message(self : Self) -> String
fn err_kind(self : Self) -> String
}pub(all) suberror IriError {
NoScheme(Int)
InvalidScheme(Char, Int)
InvalidCharacter(Char, Int)
InvalidPath(Int)
InvalidAuthority(String)
InvalidPercentEncoding(Int)
UnexpectedEnd(Int)
} derive(Debug)pub(all) suberror ParseError {
StructSyntaxErr(String, Int, (Int, Int))
SyntaxErr(String, (Int, Int))
ValidationErr(String)
IriErr(String)
} derive(Debug)pub(all) suberror TagParseErr {
EmptyTag
EmptySubtag
InvalidLanguageLength
ForbiddenChar
TooManyExtlangs
InvalidSubtag((Int, Int), StringView)
EmptyExtension
EmptyPrivateUse
InvalidVariant
InvalidPrivateUsePrefix
} derive(Debug)impl Show for TagParseErrimpl Show for BaseDirectionfn Iri::resolve(self : Iri, ref_iri : BytesView, remove_dot_segments? : Bool) -> Result[Iri, ParseError]impl Show for LanguageTagfn Literal::new_directional_language_tagged_literal(value : String, language : String, direction : BaseDirection) -> Result[Literal, TagParseErr]fn Literal::new_directional_language_tagged_literal_unchecked(value : StringView, language : LanguageTag, direction : BaseDirection) -> Literalfn Literal::new_language_tagged_literal(value : String, language : String) -> Result[Literal, TagParseErr]pub(all) enum LiteralContent {
String(String)
LanguageTaggedString(value~ : String, language~ : String)
DirectionalLanguageTaggedString(value~ : StringView, language~ : String, direction~ : BaseDirection)
TypedLiteral(value~ : String, datatype~ : NamedNode)
} derive(Eq, Hash, Debug)pub(all) enum LiteralRefContent {
String(StringView)
LanguageTaggedString(value~ : String, language~ : StringView)
DirectionalLanguageTaggedString(value~ : StringView, language~ : StringView, direction~ : BaseDirection)
TypedLiteral(value~ : String, datatype~ : NamedNodeRef)
} derive(Eq, Hash, Debug)pub(all) struct NQuadsEngine {
pending : PendingQuad
lexer : Lexerc
data : ArrayView[Byte]
last_error : ((Int, Int), Int)?
line : Int
}impl Show for NamedNodeRefpub struct PendingQuad {
subj : (Int, Int)
pred : (Int, Int)
obj : (Int, Int)
graph : (Int, Int)
has_dot : Bool
state : PendingState
} derive(Eq, Debug)impl Show for PrivateUsepub struct SliceParser {
engine : NQuadsEngine
data : ArrayView[Byte]
lenient : Bool
errors : Array[ParseError]
}pub(all) enum Token {
Dot((Int, Int))
Semicolon((Int, Int))
Comma((Int, Int))
Iri((Int, Int))
Literal((Int, Int))
BlankNode((Int, Int))
PrefName((Int, Int))
Unknown((Int, Int))
EOF(Int)
} derive(Debug)pub(all) enum Tokenfast {
IRI(Int, Int)
Blank(Int, Int)
Literal(Int, Int)
Symbol(Byte, Int, Int)
LineJump(Int, Int)
EOF(Int)
Error(Int, Int)
} derive(Debug)fn find_newline_in_range(bytes : BytesView, start : Int, end : Int) -> Int?fn fn_remove_dot_segments(path : StringView) -> StringViewInstall
Download zipMoonTTL is a high-performance RDF parsing and serialization library for MoonBit.