Skip to content
A JSON-LD processor for Go
Branch: master
Clone or download
Latest commit cf8c697 Jan 16, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
examples Enable JSON-LD 1.1 in examples and README.md Jan 2, 2019
ld Propagate processing mode to ToRDF function Jan 2, 2019
.gitignore
.travis.yml
CHANGELOG.md Update changelog to include v0.2.0 details Jan 16, 2019
CONTRIBUTORS.md Update change log and contributors list Dec 12, 2018
LICENSE
Makefile Initial copy from https://github.com/kazarena/json-gold Dec 24, 2017
README.md
go.mod Go 1.11 Module Support Dec 4, 2018
go.sum Go 1.11 Module Support Dec 4, 2018

README.md

JSON-goLD Documentations Travis CI results GoCover.io

This library is an implementation of the JSON-LD 1.1 specification in Go. It supports both URDNA2015 and URGNA2012 RDF dataset normalisation algorithms.

Conformance

This library aims to pass the official test suite and conform with the following:

As of January 1, 2019:

Examples

Expand

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)

Compact

See complete code in examples/compact.go.

proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")
// add the processing mode explicitly if you need JSON-LD 1.1 features
options.ProcessingMode = ld.JsonLd_1_1

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)

Flatten

See complete code in examples/flatten.go.

proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")
// add the processing mode explicitly if you need JSON-LD 1.1 features
options.ProcessingMode = ld.JsonLd_1_1

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)

Frame

See complete code in examples/frame.go.

proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")
// add the processing mode explicitly if you need JSON-LD 1.1 features
options.ProcessingMode = ld.JsonLd_1_1

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)

To RDF

See complete code in examples/to_rdf.go.

proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")
// add the processing mode explicitly if you need JSON-LD 1.1 features
options.ProcessingMode = ld.JsonLd_1_1
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)

From RDF

See complete code in examples/from_rdf.go.

proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")
// add the processing mode explicitly if you need JSON-LD 1.1 features
options.ProcessingMode = ld.JsonLd_1_1

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)

Normalize

See complete code in examples/normalize.go.

proc := ld.NewJsonLdProcessor()
options := ld.NewJsonLdOptions("")
// add the processing mode explicitly if you need JSON-LD 1.1 features
options.ProcessingMode = ld.JsonLd_1_1
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)

Inspiration

This implementation was heavily influenced by JSONLD-Java with some techniques borrowed from PyLD and gojsonld. Big thank you to the contributors of the forementioned libraries for figuring out implementation details of the core algorithms.

History

The original library was written by Stan Nazarenko (@kazarena). See the full list of contributors here.

You can’t perform that action at this time.