A JSON-LD processor for Go
This library is an implementation of the JSON-LD 1.1 specification in Go. It supports both URDNA2015 and URGNA2012 RDF dataset normalisation algorithms.
This library aims to pass the official test suite and conform with the following:
This library provides comprehensive support of JSON-LD 1.1 specification, except in the areas mentioned below:
Good coverage.
Good coverage, except:
@included
directive not supportedGood coverage, except:
@json
)rdfDirection
option is not yet supported (including i18n-datatype and compound-literal forms)Not supported.
Not supported. The current implementation is still based on an earlier version of JSON-LD 1.1 Framing specification.
As of April 4th, 2020:
See complete code in examples/expand.go.
proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")
// expanding remote document
expanded, err := proc.Expand("http://json-ld.org/test-suite/tests/expand-0002-in.jsonld", options)
if err != nil {
log.Println("Error when expanding JSON-LD document:", err)
return
}
// expanding in-memory document
doc := map[string]interface{}{
"@context": "http://schema.org/",
"@type": "Person",
"name": "Jane Doe",
"jobTitle": "Professor",
"telephone": "(425) 123-4567",
"url": "http://www.janedoe.com",
}
expanded, err = proc.Expand(doc, options)
See complete code in examples/compact.go.
proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")
doc := map[string]interface{}{
"@id": "http://example.org/test#book",
"http://example.org/vocab#contains": map[string]interface{}{
"@id": "http://example.org/test#chapter",
},
"http://purl.org/dc/elements/1.1/title": "Title",
}
context := map[string]interface{}{
"@context": map[string]interface{}{
"dc": "http://purl.org/dc/elements/1.1/",
"ex": "http://example.org/vocab#",
"ex:contains": map[string]interface{}{
"@type": "@id",
},
},
}
compactedDoc, err := proc.Compact(doc, context, options)
See complete code in examples/flatten.go.
proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")
doc := map[string]interface{}{
"@context": []interface{}{
map[string]interface{}{
"name": "http://xmlns.com/foaf/0.1/name",
"homepage": map[string]interface{}{
"@id": "http://xmlns.com/foaf/0.1/homepage",
"@type": "@id",
},
},
map[string]interface{}{
"ical": "http://www.w3.org/2002/12/cal/ical#",
},
},
"@id": "http://example.com/speakers#Alice",
"name": "Alice",
"homepage": "http://xkcd.com/177/",
"ical:summary": "Alice Talk",
"ical:location": "Lyon Convention Centre, Lyon, France",
}
flattenedDoc, err := proc.Flatten(doc, nil, options)
See complete code in examples/frame.go.
proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")
doc := map[string]interface{}{
"@context": map[string]interface{}{
"dc": "http://purl.org/dc/elements/1.1/",
"ex": "http://example.org/vocab#",
"ex:contains": map[string]interface{}{"@type": "@id"},
},
"@graph": []interface{}{
map[string]interface{}{
"@id": "http://example.org/test/#library",
"@type": "ex:Library",
"ex:contains": "http://example.org/test#book",
},
map[string]interface{}{
"@id": "http://example.org/test#book",
"@type": "ex:Book",
"dc:contributor": "Writer",
"dc:title": "My Book",
"ex:contains": "http://example.org/test#chapter",
},
map[string]interface{}{
"@id": "http://example.org/test#chapter",
"@type": "ex:Chapter",
"dc:description": "Fun",
"dc:title": "Chapter One",
},
},
}
frame := map[string]interface{}{
"@context": map[string]interface{}{
"dc": "http://purl.org/dc/elements/1.1/",
"ex": "http://example.org/vocab#",
},
"@type": "ex:Library",
"ex:contains": map[string]interface{}{
"@type": "ex:Book",
"ex:contains": map[string]interface{}{
"@type": "ex:Chapter",
},
},
}
framedDoc, err := proc.Frame(doc, frame, options)
See complete code in examples/to_rdf.go.
proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")
options.Format = "application/n-quads"
// this JSON-LD document was taken from http://json-ld.org/test-suite/tests/toRdf-0028-in.jsonld
doc := map[string]interface{}{
"@context": map[string]interface{}{
"sec": "http://purl.org/security#",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"dc": "http://purl.org/dc/terms/",
"sec:signer": map[string]interface{}{"@type": "@id"},
"dc:created": map[string]interface{}{"@type": "xsd:dateTime"},
},
"@id": "http://example.org/sig1",
"@type": []interface{}{"rdf:Graph", "sec:SignedGraph"},
"dc:created": "2011-09-23T20:21:34Z",
"sec:signer": "http://payswarm.example.com/i/john/keys/5",
"sec:signatureValue": "OGQzNGVkMzVm4NTIyZTkZDYMmMzQzNmExMgoYzI43Q3ODIyOWM32NjI=",
"@graph": map[string]interface{}{
"@id": "http://example.org/fact1",
"dc:title": "Hello World!",
},
}
triples, err := proc.ToRDF(doc, options)
See complete code in examples/from_rdf.go.
proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")
triples := `
<http://example.com/Subj1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/Type> .
<http://example.com/Subj1> <http://example.com/prop1> <http://example.com/Obj1> .
<http://example.com/Subj1> <http://example.com/prop2> "Plain" .
<http://example.com/Subj1> <http://example.com/prop2> "2012-05-12"^^<http://www.w3.org/2001/XMLSchema#date> .
<http://example.com/Subj1> <http://example.com/prop2> "English"@en .
`
doc, err := proc.FromRDF(triples, options)
See complete code in examples/normalize.go.
proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")
options.Format = "application/n-quads"
options.Algorithm = "URDNA2015"
doc := map[string]interface{}{
"@context": map[string]interface{}{
"ex": "http://example.org/vocab#",
},
"@id": "http://example.org/test#example",
"@type": "ex:Foo",
"ex:embed": map[string]interface{}{
"@type": "ex:Bar",
},
}
normalizedTriples, err := proc.Normalize(doc, options)
This implementation was influenced by Ruby JSON-LD reader/writer, JSONLD-Java with some techniques borrowed from PyLD and gojsonld. Big thank you to the contributors of the aforementioned libraries for figuring out implementation details of the core algorithms.
The original library was written by Stan Nazarenko (@kazarena). See the full list of contributors here.