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 trait ParserEngine {
fn error_recovery_state(Self) -> Self
fn create_pending(Self) -> PendingQuad
fn step(Self, pending : PendingQuad, token : Token) -> StepResult
fn is_complete(Self, pending : PendingQuad) -> Bool
fn recognize_end(Self, pending : PendingQuad, results : Array[(Int, Int)]) -> Unit
}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 {
InvalidErrMessage(String)
InvalidToken(String, (Int, Int))
} derive(Debug)pub(all) suberror TagParseErr {
EmptyExtension
EmptyPrivateUse
ForbiddenChar
InvalidSubtag(Int, StringView)
InvalidLanguage
SubtagTooLong
EmptySubtag
TooManyExtlangs
InvalidLanguageLength
} derive(Debug)impl Show for TagParseErrimpl Show for BaseDirectionpub(all) struct LanguageTag {
tag : StringView
positions : TagElementsPositions
} derive(Default, Eq, Hash, Debug)impl Show for LanguageTagimpl ParserEngine for NQuadsEnginepub struct Parser[E] {
lexer : Lexerc
engine : E
pending : PendingQuad
errors : Array[ParseError]
data : ArrayView[Byte]
}pub struct PendingQuad {
subj : (Int, Int)?
pred : (Int, Int)?
obj : (Int, Int)?
graph : (Int, Int)?
has_dot : Bool
state : PendingState
line : Int
} derive(Eq, Debug)fn[E] SliceParser::new(parser : Parser[E], data : ArrayView[Byte], lenient? : Bool) -> SliceParser[E]fn[E : ParserEngine] SliceParser::parse_all(self : SliceParser[E]) -> (Array[QuadSpan], Array[ParseError])pub(all) enum SubtagType {
PrivateUseIntro
ExtensionIntro(Char)
Alphabetic(Int)
Numeric(Int)
Alphanumeric(Int)
Invalid
}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)fn find_newline_in_range(bytes : BytesView, start : Int, end : Int) -> Int?Install
Download zipMoonTTL is a high-performance RDF parsing and serialization library for MoonBit.