-
Notifications
You must be signed in to change notification settings - Fork 21
Tutorial
This tutorial will explain in detail how to use and configure the Linked Data Theatre. We will start with a most basic configuration (the infamous "hello world" application) and go into more detail from their. Please look at the sidebar if you're more into self-discovery or are in need for information about a particular appearance.
To use this tutorial, please be sure that you have:
- An update version of the Linked Data Theatre, installed as the ROOT application of a Tomcat webserver running at port 8080.
- A triple store with a sparql endpoint at
http://localhost:8890/sparql
, for example a default installation of Virtuoso Open Source. - A version of
curl.exe
. Downloads are available at https://curl.haxx.se.
Every Linked Data Theatre contains at least one site and one stage. A site corresponds with a particular website (like www.mydoman.com
, www.example.org
or even localhost
). It is important to note that the site also includes the port number (so localhost:8080
is a different site than localhost:8888
).
Every site has at least one stage. The mainstage corresponds with the root of a site, any other site correponds with the first part after the domain name (for example: localhost:8080\stage-one
or localhost:8080\stage-two
).
The file WEB-INF/resource/apps/ld/config.xml
contains the configuration of sites and stages. For this tutorial we will use the default config:
<theatre configuration-endpoint="http://localhost:8890/sparql" local-endpoint="http://localhost:8890/sparql" sparql="yes">
<site domain="localhost:8080" backstage="localhost:8080>
<stage /> <!-- mainstage -->
</site>
</theatre>
The configuration-endpoint
and local-endpoint
parts refer to the SPARQL endpoint that is used to fetch the configuration of the Linked Data Theatre and as a default endpoint to query for the actual Linked Data that is presented in the Theatre.
The Linked Data Theatre looks for the configuration of a stage in a particular named graph. The URI of the named graph corresponds to the following structure:
{domain}/{stage}/stage
For example (the first example is a mainstage, the second example is an explicitly named stage at the same site):
http://localhost:8080/stage
http://localhost:8080/stage-one/stage
You can always look at the content of the configuration via the backstage of a particular stage:
Structure: {domain}/{stage}/backstage
Example: http://localhost:8080/backstage
It is possible to change the configuration via the backstage. And you can even import or export the whole configuration. The easiest way, however, is to upload configuration files directly to the triplestore. We will use this way during the tutorial. Please follow these steps:
-
Create a folder somewhere on your filesystem.
-
Create a subfolder within this folder with the name
tutorial
, go back to the folder created in step 1. -
Put a copy of
curl.exe
in this folder (skip this step if you've already a working version of curl on your system) -
Download the file empty.ttl and place it in the same folder.
-
Download the file deploy-examples.bat if you have a windows operating system, or deploy-examples.sh if you have a mac or linux operation system.
-
Execute the script, and check if the script works. You should get the result below:
Empty graph Done Press any key to continue. . .
You should store all files created in this tutorial in the subfolder tutorial
. The name of the file doesn't matter, as long as it ends with .ttl
.
Your first try at the Linked Data Theatre would be the infamous hello world application. Please create a file helloWorld.ttl
in the tutorial
subfolder with the following content:
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:helloWorld a elmo:Representation;
elmo:url-pattern "query/helloWorld$";
elmo:appearance elmo:HtmlAppearance;
elmo:data [
rdfs:label "Hello World";
elmo:html '''
<h3>Hello World!</h3>
<p>This is the first of the Linked Data Theatre examples.</p>
''';
]
.
Execute the deploy-examples
script and look at the result at http://localhost:8080/query/helloWorld You should get something like the screenshot below.
For every example in the tutorial, please use a different filename (except when instructed otherwise) and execute deploy-examples
, after you've created the file, so you can look at the result in a browser. We won't mention this any more, but please do!
Wikipedia pages are available as Linked Data via dbpedia. Let's visualize some data from dbpedia. For example: showing all properties from the city of Amersfoort (http://dbpedia.org/resource/Amersfoort):
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:amersfoort a elmo:Representation;
elmo:url-pattern "query/amersfoort$";
elmo:endpoint <http://nl.dbpedia.org/sparql>;
elmo:query '''
CONSTRUCT {
<http://nl.dbpedia.org/resource/Amersfoort> ?p ?o
}
WHERE {
<http://nl.dbpedia.org/resource/Amersfoort> ?p ?o
}
'''
.
As you might notice: we didn't specify a particular elmo:appearance
in this example. De LDT will try to figure out which appearance looks best (in this case: an elmo:ContentAppearance
.
You probably want to tune the result a bit: this way, it isn't much better than the original page! You can use elmo:fragment
s to spicy things up, for example (make these changes in the same file you've created above):
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:amersfoort2 a elmo:Representation;
elmo:fragment [
elmo:applies-to elmo:Fragment;
elmo:appearance elmo:HiddenAppearance;
];
elmo:fragment [
elmo:applies-to rdfs:comment;
rdfs:label "discription"@en;
rdfs:label "omschrijving"@nl;
];
elmo:url-pattern "query/amersfoort2$";
elmo:endpoint <http://nl.dbpedia.org/sparql>;
elmo:query '''
CONSTRUCT {
<http://nl.dbpedia.org/resource/Amersfoort> ?p ?o
}
WHERE {
<http://nl.dbpedia.org/resource/Amersfoort> ?p ?o
}
'''
.
The first fragment is a special one: it defines the default for any fragment. In this case: we don't want to show any properties, instead the ones we explicitly define. The second one specifies how to show the property rdfs:comment
.
Because we want to look into a lot more dbpedia resources, we might want to generalize from the first example. We can do this by using a elmo:uri-pattern
instead of a elmo:url-pattern
. This will tell the LDT to use this specific representation whenever the URI of the resource itself corresponds to the uri-pattern:
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:dbpediaNLResource a elmo:Representation;
elmo:uri-pattern "^http://nl.dbpedia.org/";
elmo:endpoint <http://nl.dbpedia.org/sparql>;
elmo:query stage:ResourceQuery;
.
stage:dbpediaResource a elmo:Representation;
elmo:uri-pattern "^http://dbpedia.org/";
elmo:endpoint <http://dbpedia.org/sparql>;
elmo:query stage:ResourceQuery;
.
stage:ResourceQuery a elmo:Query;
elmo:query '''
CONSTRUCT {
<@SUBJECT@> ?p ?o.
?o rdfs:label ?olabel
}
WHERE {
<@SUBJECT@> ?p ?o
FILTER (isIri(?o) || lang(?o)="" || lang(?o)="@LANGUAGE@")
OPTIONAL {
?o rdfs:label ?olabel.
FILTER (lang(?olabel) || lang(?olabel)="@LANGUAGE@")
}
}
'''
.
Let's try it out: http://localhost:8080/resource?subject=http://nl.dbpedia.org/resource/Amersfoort. Please don't hesistate to follow the links. You will notice that all dbpedia links will actually work! Data is fetched from two different SPARQL endpoints: at nl.dbpedia.org
for the dutch resources, and dbpedia.org
for the regular resources (like vocabularies).
You might notice that the're something going on here. Both representations refer to the same query (stage:ResourceQuery
). This is a way of reusing SPARQL statements that you use often for different situations. This query also uses an open parameter: @SUBJECT@
this is replaced by the actual URI of the subject resource.
Wouldn't it be cool if we could show the Linked Data actually in a graph? And maybe we want to show links going in both directions (for example: what kind of information is available about Amersfoort). This can be done with the elmo:GraphAppearance
. Remember that this graph appearance will only work if and only if a @SUBJECT@
is available. So we might append the resource configuration we've create above. Please change this configuration so it looks like the one below:
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:dbpediaNLResource a elmo:Representation;
elmo:uri-pattern "^http://nl.dbpedia.org/";
elmo:endpoint <http://nl.dbpedia.org/sparql>;
elmo:query stage:ResourceQuery;
elmo:index "1";
elmo:contains stage:dbpediaNLResourceGraph;
.
stage:dbpediaResource a elmo:Representation;
elmo:uri-pattern "^http://dbpedia.org/";
elmo:endpoint <http://dbpedia.org/sparql>;
elmo:query stage:ResourceQuery;
.
stage:ResourceQuery a elmo:Query;
elmo:query '''
CONSTRUCT {
<@SUBJECT@> ?p ?o.
?o rdfs:label ?olabel
}
WHERE {
<@SUBJECT@> ?p ?o
FILTER (isIri(?o) || lang(?o)="" || lang(?o)="@LANGUAGE@")
OPTIONAL {
?o rdfs:label ?olabel.
FILTER (lang(?olabel) || lang(?olabel)="@LANGUAGE@")
}
}
'''
.
stage:dbpediaNLResourceGraph a elmo:Part;
elmo:appearance elmo:GraphAppearance;
elmo:index "2";
elmo:endpoint <http://nl.dbpedia.org/sparql>;
elmo:query '''
CONSTRUCT {
<@SUBJECT@> ?p ?o.
<@SUBJECT@> rdfs:label ?slabel.
?o rdfs:label ?olabel
}
WHERE {
<@SUBJECT@> ?p ?o.
<@SUBJECT@> rdfs:label ?slabel.
?o rdfs:label ?olabel
FILTER (?p!=<http://dbpedia.org/ontology/wikiPageWikiLink>)
}
''';
.
The extra property elmo:contains
directs the theatre to present a second appearance on the same page. This is our graph appearance. You might notice the use of elmo:index
to define the order of the specific appearances.
Up to this point, we've only used CONSTRUCT
queries to fetch data from a sparql endpoint. But we can also use a SELECT
query. Because the result is more suited for a table, the LDT will present the result using a table appearance.
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:dbpedia a elmo:Representation;
elmo:url-pattern "/query/dbpedia$";
elmo:endpoint <http://nl.dbpedia.org/sparql>;
elmo:fragment [
elmo:applies-to "type";
rdfs:label "Classes at nl.dbpedia"@en;
rdfs:label "Aanwezige klassen in nl.dbpedia"@nl;
];
elmo:query '''
SELECT DISTINCT ?type ?type_label (count(?s) as ?type_count)
WHERE {
?s rdf:type ?type.
OPTIONAL {?type rdfs:label ?type_label}
}
LIMIT 100
''';
.
The ?type_label
and ?type_count
will trigger specific behaviour: instead of an extra column, the _label
is used for the actual label of the original variable, and _count
is used to create an annotation in the same column.
Geospatial information and Linked Data work very well together. So it would be fun to plot some Linked Data on a map. The GeoAppearance
is well suited for this goal. We will use some Linked Data from a dutch Geospatial Linked Data endpoint, https://data.pdok.nl.
Warning: using the pdok endpoint is a bit more complicated than the dbpedia endpoint, because the pdok endpoint is a secure (https) endpoint with a certificate that is not present in the default java keystore. If you experience the error "(xxforms-internal-error)", you have to perform the following steps:
- Download the files properties-local.xml and ldt.jks
- Put these files in the `D:/Tomcat/webapps/ROOT/WEB-INF/resources/config directory.
- If the installation of tomcat is in a different place, please update the file properties-local.xml accordingly.
- Restart Tomcat.
We can show the borders of the city of Amersfoort via:
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:geo a elmo:Representation;
elmo:url-pattern "query/geo$";
elmo:appearance elmo:GeoAppearance;
elmo:endpoint <https://data.pdok.nl/sparql>;
elmo:query '''
prefix geosparql: <http://www.opengis.net/ont/geosparql#>
prefix geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
construct {
?city geo:geometry ?wkt.
?city rdfs:label ?cityname.
}
WHERE {
select *
where {
?city rdfs:label ?cityname.
?city geosparql:hasGeometry ?geo.
?geo geosparql:asWKT ?wkt.
FILTER (?city = <http://bag.basisregistraties.overheid.nl/bag/id/woonplaats/1664>)
}
limit 1
}
'''
.
Most applications need some kind of menu. You can create a menu using the NavbarSearch appearance. This will not only create a menu, but a place to enter a search term as well.
Let's start with putting our current examples in a menu:
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix xhtml: <http://www.w3.org/1999/xhtml/vocab#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:menu a elmo:Representation;
elmo:url-pattern "/";
elmo:index "~";
elmo:appearance elmo:NavbarSearchAppearance;
elmo:data [
rdfs:label "LDT Tutorial";
xhtml:link "/";
elmo:data [
elmo:index "1";
rdfs:label "backstage";
xhtml:link "backstage"
];
elmo:data [
elmo:index "2";
rdfs:label "Appearances";
elmo:data [elmo:index "1"; rdfs:label "Hello world"; xhtml:link "query/helloWorld"];
elmo:data [elmo:index "2"; rdfs:label "DBPedia Amersfoort"; xhtml:link "resource?subject=http://nl.dbpedia.org/resource/Amersfoort"];
elmo:data [elmo:index "3"; rdfs:label "Geospatial"; xhtml:link "query/geo"]
]
]
.
The menu that we have created contains a search input field. It doesn't do anything yet. To enable search, you should create a representation for the url /query/search
:
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:search a elmo:Representation;
elmo:url-pattern "/query/search$";
elmo:endpoint <http://nl.dbpedia.org/sparql>;
elmo:query '''
SELECT ?item ?item_label
WHERE {
?item rdf:type skos:Concept.
?item rdfs:label ?item_label.
FILTER REGEX(?item_label,"^@TERM@","i")
}
LIMIT 10
''';
.
The search above only works for a certain kind of resource (of type skos:Concept
. You could remove this limit, but the query would be very slow. We could change this by adding a "advanced" search form, that is only triggered when the user doesn't enter any search term. Change the file above to:
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix stage: <http://localhost:8080/stage#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
stage:search a elmo:Representation;
elmo:url-pattern "/query/search$";
elmo:contains stage:searchAdvanced;
elmo:contains stage:searchClasses;
elmo:endpoint <http://nl.dbpedia.org/sparql>;
elmo:without-parameter "class";
elmo:queryForm stage:searchForm;
elmo:query '''
SELECT ?item ?item_label
WHERE {
?item rdf:type skos:Concept.
?item rdfs:label ?item_label.
FILTER REGEX(?item_label,"^@TERM@","i")
}
LIMIT 10
''';
.
stage:searchAdvanced a elmo:Part;
elmo:endpoint <http://nl.dbpedia.org/sparql>;
elmo:with-parameter "class";
elmo:query '''
SELECT ?item ?item_label
WHERE {
?item rdf:type <@CLASS@>.
?item rdfs:label ?item_label.
FILTER REGEX(?item_label,"^@TERM@","i")
}
LIMIT 10
''';
.
stage:searchForm a elmo:Form;
elmo:fragment [
elmo:applies-to "class";
elmo:valuesFrom stage:searchClasses;
elmo:index "1";
];
elmo:fragment [
elmo:applies-to "term";
elmo:constraint elmo:MandatoryConstraint;
elmo:index "2";
];
elmo:fragment [
elmo:appearance elmo:SubmitAppearance;
rdfs:label "Search";
elmo:index "3";
];
.
stage:searchClasses a elmo:Part;
elmo:appearance elmo:HiddenAppearance;
elmo:endpoint <http://dbpedia.org/sparql>;
elmo:query '''
construct {
?class rdfs:label ?classlabel
}
where {
select distinct ?class ?classlabel
where {
?class rdf:type owl:Class.
?class rdfs:label ?classlabel.
FILTER (lang(?classlabel)="@LANGUAGE@")
FILTER REGEX(str(?class),"^http://dbpedia.org/ontology/")
}
}
''';
.
Up till now, we haven't realy used our local triplestore (except for storing the configuration). Let's start adding stuff to our triplestore. The easiest way is using a simple container:
NB: The current version of LDT only supports containers in combination with Virtuoso
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix container: <http://localhost:8080/container/>.
container:simple a elmo:Container;
.
That's all! This container is available at http://localhost:8080/container/simple
. A container is always available at the same address as its own URI. You can use the form to insert any turtle statement, or use the upload button to upload any valid turtle or RDF/XML file.
The data you entered will be stored in a named graph with the same URI as the URI of the container. So you could fetch the data again using the query below:
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:showContainer a elmo:Representation;
elmo:url-pattern "query/container$";
elmo:appearance elmo:TableAppearance;
elmo:query '''
CONSTRUCT {?s?p?o}
WHERE {
GRAPH <http://localhost:8080/container/simple> {?s?p?o}
}
'''
.
When you have a lot of data to enter, it might not be practical that the result is presented in the edit window. So you could create a simple upload container by adding a statement to the container definition:
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix container: <http://localhost:8080/container/>.
container:simple a elmo:Container;
elmo:representation elmo:UploadRepresentation;
.
You can even upload files that don't conform to a Linked Data representation, for example a Excel upload:
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix container: <http://localhost:8080/container/>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
container:excel a elmo:Container;
elmo:representation elmo:UploadRepresentation;
elmo:translator elmo:SimpleExcelTranslator;
rdfs:label "Upload (excel)"
.
Try to show this data, by changing the query from the previous container.
The problem with the previous container is that the Excel file doesn't contain any real information about the data. So the LDT "invents" a vocabulary, using the column names. If you want to use the data in the excel file, you might want to convert the data into "real" linked data.
Please download this excel file, and upload it using the excel container from the previous example. Please look at the result: it's a list of concepts with definitions.
To convert the data, we can use a production. A production consists of scenes that are executed in a particular order. Every scene contains one SPARUL statement.
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix updatestage: <http://localhost:8080/update/>.
@prefix stage: <http://localhost:8080/stage/>.
#Production for root installations
updatestage:production a elmo:Production;
elmo:contains stage:production_scene1;
elmo:contains stage:production_scene2;
.
stage:production_scene1 a elmo:Scene;
elmo:index "1";
rdfs:label "Clear graph";
elmo:query "clear graph <http://localhost:8080/container/concept>";
.
stage:production_scene2 a elmo:Scene;
elmo:index "2";
rdfs:label "Add converted excel data";
elmo:query '''
prefix container: <http://localhost:8080/container/excel#>
insert into <http://localhost:8080/container/concept> {
?resource rdf:type skos:Concept.
?resource rdfs:label ?concept.
?resource skos:definition ?definition.
}
where {
select (iri(concat("http://localhost:8080/id/concept/",?concept)) as ?resource) ?concept ?definition
where {
graph <http://localhost:8080/container/excel> {
?item container:Concept ?concept.
?item container:Definition ?definition.
}
}
}
'''
.
Go to http://localhost:8080/update/production to try out this production. You could create the http://localhost:8080/container/concept
container to examine the result (and even change it), or create some appearance to show the results.
We have used sparql endpoints to fetch Linked Data. But what if a SPARQL endpoint is not available, but the data is available as Linked Data on a web page.
A typical use case is a the specification of a vocabulary, for example the rdfs vocabulary. The specification is available at http://www.w3.org/2000/01/rdf-schema, but that's just a web page.
You could use the special elmo:webpage
property. This property replaces the standard elmo:query
and elmo:endpoint
properties and fetches the data from the specified webpage. An elmo:VocabularyAppearance
will look good in this case:
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:vocabulary a elmo:Representation;
elmo:url-pattern "query/vocabulary$";
elmo:appearance elmo:VocabularyAppearance;
elmo:webpage "http://www.w3.org/2000/01/rdf-schema";
.
It is actually possible to fetch data from a web service, as long as the web service responds with Linked Data, or a translator has been created. In this example we use the Buienradar.xsl translator to show the actual weather forcast:
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:buienradar a elmo:Representation;
elmo:url-pattern "/query/buienradar$";
elmo:appearance elmo:GeoAppearance;
elmo:service "http://xml.buienradar.nl";
elmo:accept "application/xml";
elmo:translator elmo:BuienradarTranslator;
.
Another example uses artist data at Musicbrainz. In this case, a graph appearance is used, so it works for any artist from Musicbrainz, for example: http://localhost:8080/resource?subject=http://musicbrainz.org/ws/2/artist/0383dadf-2a4e-4d10-a46a-e9e041da8eb3
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:musicbrainz a elmo:Representation;
elmo:appearance elmo:GraphAppearance;
elmo:uri-pattern "^http://musicbrainz.org/ws/2/artist";
elmo:service "@SUBJECT@?inc=artist-rels";
elmo:accept "application/xml";
elmo:translator elmo:MusicbrainzTranslator;
.
You specify how the Linked Data Theatre retrieves the data. One way is to specify a sparql statement. SPARQL includes the option to retrieve data from multiple SPARQL endpoint (federated queries). You can use this capability to access multiple endpoints, for example:
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:amersfoort3 a elmo:Representation;
elmo:url-pattern "query/amersfoort3";
elmo:query '''
CONSTRUCT {
<http://dbpedia.org/resource/Amersfoort> ?p ?o
}
WHERE {
SERVICE <http://dbpedia.org/sparql> {
<http://dbpedia.org/resource/Amersfoort> ?p ?o
}
}
''';
.
A lot of Linked Data is available on the web, but only a few sites have an open SPARQL endpoint. What if the data is available as linked data, but not via a SPARQL endpoint?
In the previous example we have used elmo:webpage
, but what if you want to include data from multiple endpoints? In such a case, you can use the 'virtual sparql endpoint' that is included with the LDT. Please change the file above into:
NB: if you have installed your LDT in a docker container, please change localhost:8080/url
to ldt:8080/url
, assuming that your LDT docker container is named ldt
.
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:amersfoort3 a elmo:Representation;
elmo:url-pattern "query/amersfoort3";
elmo:query '''
CONSTRUCT {
<http://dbpedia.org/resource/Amersfoort> ?p ?o
}
WHERE {
SERVICE <http://localhost:8080/url> {
<http://dbpedia.org/resource/Amersfoort> ?p ?o
}
}
''';
.
The example above uses the virtual sparql endpoint at http://localhost:8080/url
. Because the syntax is identical to a normal sparql federated service, you can use the results as if they would have been retrieved from an actual sparql endpoint.
In this case, the virtual endpoint retrieves the information at the page http://dbpedia.org/resource/Amersfoort
and returns any triple ?s?p?o where ?s = http://dbpedia.org/resource/Amersfoort
.
The examples above used pages that actually contained linked data. But normal webpages are possible as well, as long as they contain some markup. This is the same way that search engines look at pages!
@prefix elmo: <http://bp4mc2.org/elmo/def#>.
@prefix stage: <http://localhost:8080/stage#>.
stage:lotr a elmo:Representation;
elmo:query '''
CONSTRUCT {?s ?p ?o}
WHERE {
{
SELECT * WHERE {
SERVICE <http://localhost:8080/url> {
GRAPH <http://www.imdb.com/title/tt0306414> {
?s ?p ?o
}
}
}
}
}
''';
.
- Home
- Theatre installation
- Tutorial
- Using the theatre
- Configuring the theatre
-
Appearances
- CarouselAppearance
- ChartAppearance
- ContentAppearance
- GeoAppearance
- GeoSelectAppearance
- GraphAppearance
- FormAppearance
- FrameAppearance
- HeaderAppearance
- HiddenAppearance
- HtmlAppearance
- IndexAppearance
- ImageAppearance
- LoginAppearance
- ModelAppearance
- NavbarAppearance
- NavbarSearchAppearance
- ShortTableAppearance
- TableAppearance
- TreeAppearance
- TextAppearance
- VocabularyAppearance
- LDT Vocabulary