swift-knowledge-graph

main

A pure-Swift, W3C-conformant Knowledge Graph library with streaming parsers for Turtle, TriG, N-Quads, RDF/XML, and JSON-LD 1.1.
1amageek/swift-knowledge-graph

swift-knowledge-graph

A pure-Swift, W3C-conformant Knowledge Graph library with streaming parsers for the major RDF serialization formats.

  • Strict Swift 6.3 concurrency (Sendable throughout)
  • Streaming, allocation-conscious parsers (parseChunk / finish)
  • No third-party dependencies

Modules

Module Purpose
KnowledgeGraph Core graph model: Node, Edge, Attribute, NamedGraph, KnowledgeGraphBuilder
KnowledgeGraphParsers Streaming parsers for Turtle, TriG, N-Quads, RDF/XML, JSON-LD 1.1

Supported formats

Format Media type Spec
Turtle text/turtle W3C RDF 1.1 Turtle
TriG application/trig W3C RDF 1.1 TriG
N-Quads application/n-quads W3C RDF 1.1 N-Quads
RDF/XML application/rdf+xml W3C RDF 1.1 XML Syntax
JSON-LD 1.1 application/ld+json W3C JSON-LD 1.1 to RDF

The JSON-LD 1.1 parser implements the toRdf algorithm and is exercised against the W3C toRdf test suite. Features outside the supported subset (scoped contexts, @nest, @included, @direction, term-driven container maps, etc.) are rejected with ParserError.unsupportedFeature rather than emitting a partial graph that disagrees with the spec.

Installation

Add to Package.swift:

dependencies: [
    .package(url: "https://github.com/1amageek/swift-knowledge-graph.git", from: "0.1.0"),
],
targets: [
    .target(
        name: "YourTarget",
        dependencies: [
            .product(name: "KnowledgeGraph", package: "swift-knowledge-graph"),
            .product(name: "KnowledgeGraphParsers", package: "swift-knowledge-graph"),
        ]
    ),
]

Usage

One-shot parse

import KnowledgeGraph
import KnowledgeGraphParsers

let text = """
@prefix ex: <http://example.org/> .
ex:alice ex:knows ex:bob .
ex:bob ex:name "Bob"@en .
"""

var parser = TurtleParser(context: ParsingContext(blankScopeID: "scope_1"))
let graph: KnowledgeGraph = try parser.parse(text)

for edge in graph.edges {
    print(edge.id.source.key, edge.id.predicate, edge.id.target.key)
}

Streaming parse

All parsers conform to KnowledgeGraphParser and accept input incrementally:

var parser = TurtleParser(context: ParsingContext(blankScopeID: "scope_1"))
var builder = KnowledgeGraphBuilder()

for chunk in inputChunks {
    try parser.parseChunk(ArraySlice(chunk), into: &builder)
}
try parser.finish(into: &builder)

let graph = builder.build()

The parser holds enough lookahead state that byte-by-byte streaming produces byte-for-byte identical results to one-shot parsing — see StreamingPartialParseTests for the equivalence proofs.

JSON-LD

var ctx = ParsingContext(blankScopeID: "scope_1")
ctx.setBaseIRI(IRI("http://example.org/"))
var parser = JSONLDParser(context: ctx)
var builder = KnowledgeGraphBuilder()
try parser.parseChunk(ArraySlice(Array(data)), into: &builder)
try parser.finish(into: &builder)
let graph = builder.build()

Testing

xcodebuild test -scheme swift-knowledge-graph -destination 'platform=macOS'

The W3C JSON-LD 1.1 toRdf suite is bundled as a test resource and run as a parameterised suite. Positive entries are validated by graph isomorphism; negative entries must throw ParserError.

License

MIT.

Description

  • Swift Tools 6.3.0
View More Packages from this Author

Dependencies

  • None
Last updated: Sun May 17 2026 12:34:27 GMT-0900 (Hawaii-Aleutian Daylight Time)