Difference between revisions of "Java Examples"

From Info216
Line 307: Line 307:
  
 
Start the Fuseki server with this command on Windows:
 
Start the Fuseki server with this command on Windows:
   fuseki-server --localhost --loc=C:\...\Your\Eclipse\workspace\INFO216\TDBTest /tdb
+
   fuseki-server --localhost --loc=C:\...\your\Eclipse\workspace\INFO216\TDBTest /tdb
  
 
On Linux:
 
On Linux:
   sh fuseki-server --localhost --loc=C:\...\Your\Eclipse\workspace\INFO216\TDBTest /tdb
+
   sh fuseki-server --localhost --loc=C:\...\your\Eclipse\workspace\INFO216\TDBTest /tdb
  
 
Here, TDBTest is the name of the triple store, INFO216 is the name of the Eclipse project, located inside your Eclipse workspace. Use the '''--help''' option to see what the other options do.
 
Here, TDBTest is the name of the triple store, INFO216 is the name of the Eclipse project, located inside your Eclipse workspace. Use the '''--help''' option to see what the other options do.
  
Open a web browser and go to '''localhost:3030''' to  
+
Open a web browser and go to '''localhost:3030''' to run queries/updates and otherwise explore and use the TDB-backed dataset.
  
 
==Lecture 5: JSON and JSON-LD==
 
==Lecture 5: JSON and JSON-LD==

Revision as of 14:09, 9 February 2017

Here are the code examples we have used in the live sessions during the lectures - along with a few additional ones.

Lecture 1: Java, Jena, and Eclipse

Hello Jena

package no.uib.sinoa.info216;

import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.vocabulary.FOAF;

public class HelloJena {

	public static void main(String[] args) {
		
		Model model = ModelFactory.createDefaultModel();
		
		Resource andreas = model.createResource("http://no.uib.infomedia.info216.ex/CadeTracy");
		andreas.addLiteral(FOAF.name, "Cade Tracy");
		
		model.write(System.out, "TURTLE");
	}	
}

Lecture 2: RDF

Resource objects

package no.uib.infomedia.info216;

...

public class HelloJena {
	public static void main(String[] args) {
		String iriBase = "http://no.uib.infomedia.info216/";
		String iriDbpedia = "http://dbpedia.org/resource/";
		
		Model model = ModelFactory.createDefaultModel();
		
		Resource resCadeTracy = model.createResource(iriBase + "Cade_Tracy");
		resCadeTracy.addLiteral(FOAF.name, "Cade Tracy");
		
		Resource resCanada = model.createResource(iriDbpedia + "Canada");
		Resource resFrance = model.createResource(iriDbpedia + "France");
		Property propVisited = model.createProperty(iriBase + "visited");
		resCadeTracy.addProperty(propVisited, resCanada);
		resCadeTracy.addProperty(propVisited, resFrance);

		model.write(System.out, "TURTLE");
	}
}

Language-tagged literals

		resFrance.addProperty(RDFS.label, "Frankrike", "no");
		resFrance.addProperty(RDFS.label, "France", "en");
		resFrance.addProperty(RDFS.label, "Francia", "es");

Typed literals

		Property propPopEst = model.createProperty(iriDbpedia + "ontology/populationEstimate");
		resFrance.addProperty(propPopEst, "66644000", XSDDatatype.XSDinteger);

Looping through statements

		for (Statement stmt : model.listStatements().toList()) {
			System.out.println(stmt.toString());
		}

Selecting statements

		for (Statement stmt : model
				.listStatements((Resource)null, RDFS.label, (RDFNode)null)
				.toList()) {
			System.out.println("Subject:   " + stmt.getSubject().toString());
			System.out.println("Predicate: " + stmt.getPredicate().toString());
			System.out.println("Object:    " + stmt.getObject().toString());
		}

Using a selector

		for (Statement stmt : model
				.listStatements(new SimpleSelector() {
					public boolean test(Statement s) { 
						return (s.getPredicate().equals(FOAF.name)); 
					}
				})
				.toList()) {
			System.out.println(stmt.getObject().toString());
		}

Writing to file

		try {
			model.write(new FileOutputStream("test.ttl"), "TURTLE");
		} catch (Exception e) {
			// TODO: handle exception
		}

Contents of test.ttl

<http://no.uib.infomedia.info216/Cade_Tracy>
        <http://no.uib.infomedia.info216/visited>
                <http://dbpedia.org/resource/France> , <http://dbpedia.org/resource/Canada> ;
        <http://xmlns.com/foaf/0.1/name>
                "Cade Tracy" .

<http://dbpedia.org/resource/France>
        <http://www.w3.org/2000/01/rdf-schema#label>
                "Francia"@es , "France"@en , "Frankrike"@no ;
        <http://dbpedia.org/resource/ontology/populationEstimate>
                66644000 .

Reading from file

package no.uib.infomedia.sinoa.info216;

import java.io.FileInputStream;

import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;

public class ReadJena {

	public static void main(String[] args) {
		Model model = ModelFactory.createDefaultModel();
		
		try {
			model.read(new FileInputStream("test.ttl"), "http://ex.org/", "TURTLE");
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		model.write(System.out);
	}
}

Reading from web resource

package no.uib.infomedia.sinoa.info216;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;

public class HttpTest {

	public static void main(String[] args) {
		Model model = ModelFactory.createDefaultModel();
		
		try {
			URL url = new URL("http://people.uib.no/sinoa/test.ttl");   
			HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();  
			InputStream is = urlConnection.getInputStream();
			model.read(is, "http://ex.org/", "TURTLE");
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		model.write(System.out);
	}
}

(There are many other ways to download web resources from Java, but HttpUrlConnection is a straightforward and built-in way to get started.)

Lecture 3: RDFS

Creating an RDFS model

		Model rdfModel = ModelFactory.createDefaultModel();
		InfModel rdfsModel = ModelFactory.createRDFSModel(rdfModel);

RDFS entailment: subClassOf

		String iriBase = "http://no.uib.infomedia.info216/";

		Resource resUCB = rdfsModel.createResource(iriBase + "UCB");
		Resource resUniversity = rdfsModel.createResource(iriBase + "University");
		resUCB.addProperty(RDF.type, resUniversity);

		Resource resHEI = rdfsModel.createResource(iriBase + "HEI");
		resUniversity.addProperty(RDFS.subClassOf, resHEI);

		rdfsModel.write(System.out, "TURTLE");

The output will show that University of Califoria, Berkeley (UCB) is a Higher-Education Institution (HEI), even though we did not assert that explicitly.

Adding namespace prefixes

		rdfsModel.setNsPrefix("", iriBase);
		rdfsModel.setNsPrefix("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
		rdfsModel.setNsPrefix("rdfs", "http://www.w3.org/2000/01/rdf-schema#");

We can do this in a single call too, by first creating a map:

		rdfsModel.setNsPrefixes(new HashMap() {{
			put("", iriBase);
			put("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
			put("rdfs", "http://www.w3.org/2000/01/rdf-schema#");
		}});

(The "double-brace notation" {{ ... }} lets us add code to initialise the new HashMap object at construction, before we pass it as a parameter to setNsPrefixes.)

Instead of

		Resource resUCB = rdfsModel.createResource(iriBase + "UCB");

we can now write

		Resource resUCB = rdfsModel.createResource(rdfsModel.getNsPrefixURI("") + "UCB");

to reduce the need for global strings in large programs and to eliminate inconsistencies by keeping all prefixes in the same place.

Outputting the RDFS axioms

		ModelFactory
			.createRDFSModel(ModelFactory.createDefaultModel())
			.write(System.out, "TURTLE");

Removing axioms from RDFS outputs

Here, we write the triples in rdfsModel to the console, after eliminating all triples that are axioms:

		InfModel axiomModel = ModelFactory.createRDFSModel(ModelFactory.createDefaultModel());
		ModelFactory
			.createDefaultModel()
			.add(rdfsModel.listStatements().toList())
			.remove(axiomModel.listStatements().toList())
			.write(System.out, "TURTLE");

RDFS entailment: subPropertyOf

		Resource resCadeTracy = rdfsModel.createResource(rdfsModel.getNsPrefixURI("") + "Cade_Tracy");
		Property propHasBScFrom = rdfsModel.createProperty(rdfsModel.getNsPrefixURI("") + "hasBScFrom");
		resCadeTracy.addProperty(propHasBScFrom, resUCB);

		Property propGraduatedFrom = rdfsModel.createProperty(rdfsModel.getNsPrefixURI("") + "graduatedFrom");
		propHasBScFrom.addProperty(RDFS.subPropertyOf, propGraduatedFrom);

		rdfsModel.write(System.out, "TURTLE");

The output will show that Cade graduated from University of Califoria, Berkeley (UCB), even though we did not assert that explicitly.

Chained RDFS entailment: subPropertyOf and domain

		propGraduatedFrom.addProperty(RDFS.domain, FOAF.Person);
		
		rdfsModel.write(System.out, "TURTLE");

The output will show that Cade is a FOAF person, even though we did not assert that explicitly.

The Reasoner object

This outputs the name of the Reasoner's class:

		System.out.println(rdfsModel.getReasoner().getClass().toString());

Lecture 4: TDB and Fuseki

Creating a dataset

        Dataset dataset = TDBFactory.createDataset();
        Model defaultModel = dataset.getDefaultModel();

        ...

        dataset.close()

This creates an in-memory dataset, which is not persistent.

Creating/loading a TDB-backed dataset

        Dataset dataset = TDBFactory.createDataset("TDBTest");
        Model defaultModel = dataset.getDefaultModel();

        ...

        dataset.close()

The first time it is run, this creates a persistent dataset, backed by a TDB triple store located in the directory "TDBTest" inside your Eclipse project. Refresh the project to see it (or F5).

When re-run later, this loads the dataset from the TDB store.

It is important to close a dataset before the program terminates.

Named models

        Model namedModel = ModelFactory.createDefaultModel();
        Resource resFrance2 = namedModel.createResource(iriDbpedia + "France");

        resFrance2.addProperty(RDFS.label, "Frankrike", "no");
        resFrance2.addProperty(RDFS.label, "France", "en");
        resFrance2.addProperty(RDFS.label, "Francia", "es");
       
        Property propPopEst = namedModel.createProperty(iriDbpedia + "ontology/populationEstimate");
        resFrance2.addProperty(propPopEst, "66644000", XSDDatatype.XSDinteger);
       
        namedModel.write(System.out, "TURTLE");
        dataset.addNamedModel("http://example.org/nm", namedModel);

        RDFDataMgr.write(System.out, dataset, Lang.TRIG);

This creates a new model and adds it as a named model to the dataset. We must use RDFDataMgr two write out datasets containing named graphs in formats such as TRIG, TRIX and NQ.

Fuseki

When you get started, it is easiest to run Fuseki from the directory where you unpacked it along with the other Jena downloads, for example:

 cd C:\Programs\Jena\apache-jena-fuseki-2.4.1

or

 cd /opt/Jena/apache-jena-fuseki-2.4.1

Start the Fuseki server with this command on Windows:

 fuseki-server --localhost --loc=C:\...\your\Eclipse\workspace\INFO216\TDBTest /tdb

On Linux:

 sh fuseki-server --localhost --loc=C:\...\your\Eclipse\workspace\INFO216\TDBTest /tdb

Here, TDBTest is the name of the triple store, INFO216 is the name of the Eclipse project, located inside your Eclipse workspace. Use the --help option to see what the other options do.

Open a web browser and go to localhost:3030 to run queries/updates and otherwise explore and use the TDB-backed dataset.

Lecture 5: JSON and JSON-LD

Theme


I will make more available after lab 5.

INFO216, UiB, Spring 2017, Prof. Andreas L. Opdahl (c)