view src/org/qmul/eecs/c4dm/sia/SiaDatapointFactory.java @ 68:260eb78f0854

modified to take into account that sia:Datapoints now have sia:vector properties which then have sia:dimVals, rather than sia:Datapoints having their own sia:dimVal properties
author stevenh
date Fri, 02 Aug 2013 10:40:42 +0100
parents f2d9567c6591
children affdfe375b41
line wrap: on
line source
package org.qmul.eecs.c4dm.sia;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import org.qmul.eecs.c4dm.sia.model.Datapoint;
import org.qmul.eecs.c4dm.sia.model.DimensionValue;
import org.qmul.eecs.c4dm.sia.model.DirectlyFollows;
import org.qmul.eecs.c4dm.sia.model.MemberOfOrderedSet;
import org.qmul.eecs.c4dm.sia.model.OrderedIndex;
import org.qmul.eecs.c4dm.sia.model.OrderedSet;
import org.qmul.eecs.c4dm.sia.model.SiaVector;

import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntResource;
import com.hp.hpl.jena.rdf.model.AnonId;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
import com.hp.hpl.jena.vocabulary.RDF;

public class SiaDatapointFactory {

	/**
	 * @param ontModel
	 * @return List<Datapoint>
	 */
	public static List<Datapoint> create(OntModel ontModel) {
		
		List<Datapoint> datapointsList = new ArrayList<Datapoint>();
		Datapoint datapoint;
		OntClass datapointClass = ontModel.getOntClass(Datapoint.RESOURCE_URI);
		
		ExtendedIterator<? extends OntResource> datapointIter;
		try
		{
			datapointIter = datapointClass.listInstances();
		}
		catch (NullPointerException npe)
		{
			return datapointsList;
		}
		
		// Find all rdf datapoints
		OntResource datapointIndividual;
		while (datapointIter.hasNext())
		{
			datapointIndividual = datapointIter.next();
			datapoint = new Datapoint();
			datapoint.setResource(datapointIndividual);
			Property vectorProperty = ontModel.getOntProperty(SiaVector.PROPERTY_URI);
			Statement vector = datapointIndividual.getProperty(vectorProperty);
			
			Vector<DimensionValue> dimValsList = SiaDimensionValueFactory.getDimensionValuesForResource(
					ontModel, vector.getResource());
			
			datapoint.setDimensionValues(dimValsList);
			datapointsList.add(datapoint);
			
		}
		return datapointsList;
	}

	/**
	 * @param ontModel
	 * @param datapoints
	 */
	public static void assertOrder(OntModel ontModel, List<Datapoint> datapoints) {
		
		Resource bnode = ontModel.createResource(AnonId.create());
		Resource siaOrderedSet = ontModel.createResource(OrderedSet.RESOURCE_URI);
		
		ontModel.add(bnode, RDF.type, siaOrderedSet);
		
		int numDatapoints = datapoints.size();

		Datapoint datapoint;
		Datapoint nextDatapoint;
		Property memberOfOrderedSetProperty;
		Property directlyFollowsProperty;
		Property orderedIndexProperty;
		
		for (int orderedIndex = 0; orderedIndex < numDatapoints; orderedIndex++)
		{
			// Assert <bnode, rdf:type, sia:OrderedSet>
			datapoint = datapoints.get(orderedIndex);
			datapoint.setOrderedIndex(orderedIndex + 1);
			memberOfOrderedSetProperty = ontModel.getProperty(MemberOfOrderedSet.PROPERTY_URI);
			ontModel.add(datapoint.getResource(), memberOfOrderedSetProperty, bnode);
			
			if (orderedIndex < numDatapoints - 1)
			{
				// Assert <nextDatapoint, sia:directlyFollows, currentDatapoint>
				nextDatapoint = datapoints.get(orderedIndex + 1);
				directlyFollowsProperty = ontModel.getProperty(DirectlyFollows.PROPERTY_URI);
				ontModel.add(nextDatapoint.getResource(), directlyFollowsProperty, datapoint.getResource());
			}
			
			// Assert <currentDatapoint, sia:orderedIndex, orderedIndex>
			orderedIndexProperty = ontModel.getProperty(OrderedIndex.PROPERTY_URI);
			ontModel.addLiteral(datapoint.getResource(), orderedIndexProperty, orderedIndex);
			
		}
	}

}