How We Use Epimorphics Linked Data API (ELDA) in Costal and Marine Spatial Planning Vocabulary project Linyun Fu
Linked Data API ELDA Stands for Epimorphics Linked Data API – Java open-source implementation Linked Data API Specification: api/wiki/Specification api/wiki/Specification – – – rm/ rm/0008 – rms rms – rm/0008/narrower rm/0008/narrower
ELDA Linked data API introduction by Epimorphics Ltd.: api api Downloadable from java -jar elda-VERSION.jar Quick start doc: elda/src/main/webapp/lda-assets/docs/E index.htmlhttp://elda.googlecode.com/hg/deliver- elda/src/main/webapp/lda-assets/docs/E index.html Installing CMSPV Vocabulary Service: aryService aryService
System architecture
Next steps Identifying an endpoint Binding variables Selecting resources Viewing resources Formatting graphs All done with spec files
Spec files sample spec file: es/elda/specs/cmspv.spec.ttl es/elda/specs/cmspv.spec.ttl in /{path/to}/Elda_standalone_{version}/webapps/elda/WEB- INF/web.xml: loader-init com.epimorphics.lda.routing.Loader com.epimorphics.api.initialSpecFile cmspv::specs/cmspv.spec.ttl 1
Identifying an endpoint spec:api a api:API;... api:sparqlEndpoint ; #api:sparqlEndpoint api:base " api:variable [api:name "base"; api:value "
Binding variables spec:api a api:API;... api:sparqlEndpoint ; #api:sparqlEndpoint api:base " api:variable [api:name "base"; api:value "
Selecting resources spec:vocabulariesEndpoint a api:ListEndpoint; api:uriTemplate "/vocabs"; api:exampleRequestPath "/vocabs"; api:selector [ api:where "?item rdf:type skos:ConceptScheme. ?item skos:prefLabel ?label."; api:orderBy "?label"; ];. api:base is "
More examples spec:vocabularyEndpoint a api:ItemEndpoint; api:uriTemplate "/vocab/{vocabulary}"; api:itemTemplate "{base}/vocab/{vocabulary}"; api:exampleRequestPath "/vocab/nims";. shows resource: {base} = {vocabulary} = nims
spec:termEndpoint a api:ItemEndpoint; api:uriTemplate "/vocab/{vocabulary}/term/{term}"; api:itemTemplate "{base}/vocab/{vocabulary}/term/{term}"; api:exampleRequestPath "/vocab/nims/term/0008";. rm/0008
spec:vocabularyTermsEndpoint a api:ListEndpoint; rdfs:comment "I am making an assumption that I can easily map the scheme URI based on the Linked Data URI"; api:uriTemplate "/vocab/{vocabulary}/terms"; api:exampleRequestPath "/vocab/nims/terms"; api:variable [ api:name "scheme"; api:value "{base}/vocab/{vocabulary}"; api:type rdfs:Resource; ] ; api:selector [ api:where "?item skos:inScheme ?scheme. ?item skos:prefLabel ?label."; api:orderBy "?label"; ] ;.
spec:NarrowerTermsEndpoint a api:ListEndpoint; api:uriTemplate "/vocab/{vocabulary}/term/{term}/narrower"; api:exampleRequestPath "/vocab/nims/term/0008/narrower"; api:variable [ api:name "concept"; api:value "{base}/vocab/{vocabulary}/term/{term}"; api:type rdfs:Resource; ] ; api:selector [ api:where "?concept skos:narrower ?item. ?item skos:prefLabel ?label."; api:orderBy "?label"; ] ;.
Viewing resources, formatting graphs spec:SKOSViewer a api:Viewer; api:name "SKOS Viewer"; api:include api:labelledDescribeViewer; extras:describeAllLabel skos:prefLabel;. spec:htmlFormatter a api:XsltFormatter; api:name "html"; api:mimeType "text/html; charset=utf-8"; api:stylesheet "lda-assets/xslt/cmspv.xsl";.
A broader chain viewer spec:broaderChainViewer a api:Viewer; api:name "Broader Chain Viewer"; api:include api:describeViewer; api:properties "prefLabel, broader.prefLabel, broader.broader.prefLabel, broader.broader.broader.prefLabel". … spec:broaderChainEndpoint a api:ItemEndpoint; api:uriTemplate "/vocab/{vocabulary}/term/{term}/broaderChain"; api:itemTemplate "{base}/vocab/{vocabulary}/term/{term}"; api:exampleRequestPath "/vocab/nims/term/0038/broaderChain"; api:defaultViewer spec:broaderChainViewer;.
Don’t forget spec:api a api:API; … api:viewer spec:broaderChainViewer, … api:endpoint spec:broaderChainEndpoint, … skos:broader a rdf:Property; api:label "broader";. skos:prefLabel a rdf:Property; api:label "prefLabel";.
/vocab/nims/term/0032/broaderChain
Using Fuseki assembler ja:. a ja:RDFDataset ; ja:defaultGraph [ a ja:OntModel ; ja:ontModelSpec ja:OWL_MEM_MICRO_RULE_INF ; ja:content [ja:externalContent, ] ]. Run fuseki with: fuseki-server --desc=cmspv-assembler.ttl /cmspv
Cherry-pick the :. a ja:RDFDataset ; ja:graph :inf. :inf a ja:InfModel ; ja:baseModel :data ; ja:reasoner [ ja:reasonerURL ; ja:rulesFrom ]. :data a ja:MemoryModel ; ja:content [ja:externalContent, ].
The rules file # RDFS Closure rules [rdfs6: (?p rdfs:subPropertyOf ?q), notEqual(?p,?q) -> table(?p, ?q), [ (?a ?q ?b) <- (?a ?p ?b)] ] # inverseOf [inverseOf1: (?P owl:inverseOf ?Q) -> (?Q owl:inverseOf ?P) ] [inverseOf2: (?P owl:inverseOf ?Q) -> table(?P), table(?Q), [inverseOf2b: (?X ?P ?Y) <- (?Y ?Q ?X)] ] # TransitiveProperty [transitiveProperty1: (?P rdf:type owl:TransitiveProperty) -> table(?P), [transitiveProperty1b: (?A ?P ?C) <- bound (?C), (?B ?P ?C), (?A ?P ?B)] [transitiveProperty1b: (?A ?P ?C) <- unbound (?C), (?A ?P ?B) (?B ?P ?C)] ] # SymmetricProperty [symmetricProperty1: (?P rdf:type owl:SymmetricProperty) -> table(?P), [symmetricProperty1b: (?X ?P ?Y) <- (?Y ?P ?X)] ]
Direct access SPARQL endpoint: RDF file: cts/cmspv/branches/initial_rdf/skos/nims.ttl cts/cmspv/branches/initial_rdf/skos/nims.ttl