NIHVIVO-1333 Continued work on display of object properties on individual profile, including getting sparql query and template name from a config file and using it to generate and display statements.

This commit is contained in:
rjy7 2010-12-07 21:30:13 +00:00
parent 1bad0658cb
commit e4d301cf98
18 changed files with 243 additions and 59 deletions

View file

@ -54,5 +54,7 @@ public interface ObjectPropertyDao extends PropertyDao {
public List<ObjectProperty> getObjectPropertyList(Individual subject); public List<ObjectProperty> getObjectPropertyList(Individual subject);
public List<ObjectProperty> getObjectPropertyList(String subjectUri); public List<ObjectProperty> getObjectPropertyList(String subjectUri);
public String getCustomShortView();
} }

View file

@ -28,5 +28,6 @@ public interface ObjectPropertyStatementDao {
Individual fillExistingObjectPropertyStatements( Individual entity ); Individual fillExistingObjectPropertyStatements( Individual entity );
int insertNewObjectPropertyStatement(ObjectPropertyStatement objPropertyStmt ); int insertNewObjectPropertyStatement(ObjectPropertyStatement objPropertyStmt );
public List<ObjectPropertyStatement> getObjectPropertyStatementsForIndividualByProperty(Individual subject, ObjectProperty property, String query);
} }

View file

@ -102,6 +102,7 @@ public class VitroVocabulary {
public static final String PROPERTY_CUSTOMENTRYFORMANNOT = vitroURI+"customEntryFormAnnot"; public static final String PROPERTY_CUSTOMENTRYFORMANNOT = vitroURI+"customEntryFormAnnot";
public static final String PROPERTY_CUSTOMDISPLAYVIEWANNOT = vitroURI+"customDisplayViewAnnot"; public static final String PROPERTY_CUSTOMDISPLAYVIEWANNOT = vitroURI+"customDisplayViewAnnot";
public static final String PROPERTY_CUSTOMSHORTVIEWANNOT = vitroURI+"customShortViewAnnot"; public static final String PROPERTY_CUSTOMSHORTVIEWANNOT = vitroURI+"customShortViewAnnot";
public static final String PROPERTY_CUSTOM_LIST_VIEW_ANNOT = vitroURI + "customListViewAnnot";
public static final String PROPERTY_SELECTFROMEXISTINGANNOT = vitroURI+"selectFromExistingAnnot"; public static final String PROPERTY_SELECTFROMEXISTINGANNOT = vitroURI+"selectFromExistingAnnot";
public static final String PROPERTY_OFFERCREATENEWOPTIONANNOT = vitroURI+"offerCreateNewOptionAnnot"; public static final String PROPERTY_OFFERCREATENEWOPTIONANNOT = vitroURI+"offerCreateNewOptionAnnot";
public static final String PROPERTY_INPROPERTYGROUPANNOT = vitroURI+"inPropertyGroupAnnot"; public static final String PROPERTY_INPROPERTYGROUPANNOT = vitroURI+"inPropertyGroupAnnot";

View file

@ -214,4 +214,9 @@ class ObjectPropertyDaoFiltering extends BaseFiltering implements ObjectProperty
public List<ObjectProperty> getObjectPropertyList(String subjectUri) { public List<ObjectProperty> getObjectPropertyList(String subjectUri) {
return innerObjectPropertyDao.getObjectPropertyList(subjectUri); return innerObjectPropertyDao.getObjectPropertyList(subjectUri);
} }
@Override
public String getCustomShortView() {
return innerObjectPropertyDao.getCustomShortView();
}
} }

View file

@ -81,4 +81,12 @@ class ObjectPropertyStatementDaoFiltering extends BaseFiltering implements Objec
return innerObjectPropertyStatementDao.insertNewObjectPropertyStatement(objPropertyStmt); return innerObjectPropertyStatementDao.insertNewObjectPropertyStatement(objPropertyStmt);
} }
@Override
// RY What about filtering?
public List<ObjectPropertyStatement> getObjectPropertyStatementsForIndividualByProperty(
Individual subject, ObjectProperty property, String query) {
return innerObjectPropertyStatementDao.getObjectPropertyStatementsForIndividualByProperty(subject, property, query);
}
} }

View file

@ -297,13 +297,13 @@ public class DataPropertyStatementDaoJena extends JenaBaseDao implements DataPro
QueryExecution qexec = QueryExecutionFactory.create(dataPropertyValueQuery, getOntModelSelector().getFullModel(), bindings); QueryExecution qexec = QueryExecutionFactory.create(dataPropertyValueQuery, getOntModelSelector().getFullModel(), bindings);
ResultSet results = qexec.execSelect(); ResultSet results = qexec.execSelect();
List<DataPropertyStatement> values = new ArrayList<DataPropertyStatement>(); List<DataPropertyStatement> statements = new ArrayList<DataPropertyStatement>();
while (results.hasNext()) { while (results.hasNext()) {
QuerySolution sol = results.next(); QuerySolution sol = results.next();
Literal value = sol.getLiteral("value"); Literal value = sol.getLiteral("value");
DataPropertyStatement dps = new DataPropertyStatementImpl(subjectUri, propertyUri, value.getLexicalForm()); DataPropertyStatement dps = new DataPropertyStatementImpl(subjectUri, propertyUri, value.getLexicalForm());
values.add(dps); statements.add(dps);
} }
return values; return statements;
} }
} }

View file

@ -101,30 +101,4 @@ public class DataPropertyStatementDaoSDB extends DataPropertyStatementDaoJena
} }
} }
} }
@Override
public List<DataPropertyStatement> getDataPropertyStatementsForIndividualByProperty(Individual subject, DataProperty property) {
log.debug("dataPropertyValueQueryString:\n" + dataPropertyValueQueryString);
log.debug("dataPropertyValueQuery:\n" + dataPropertyValueQuery);
String subjectUri = subject.getURI();
String propertyUri = property.getURI();
QuerySolutionMap bindings = new QuerySolutionMap();
bindings.add("subject", ResourceFactory.createResource(subjectUri));
bindings.add("property", ResourceFactory.createResource(propertyUri));
// Run the SPARQL query to get the properties
QueryExecution qexec = QueryExecutionFactory.create(dataPropertyValueQuery, getOntModelSelector().getFullModel(), bindings);
ResultSet results = qexec.execSelect();
List<DataPropertyStatement> values = new ArrayList<DataPropertyStatement>();
while (results.hasNext()) {
QuerySolution sol = results.next();
Literal value = sol.getLiteral("value");
DataPropertyStatement dps = new DataPropertyStatementImpl(subjectUri, propertyUri, value.getLexicalForm());
values.add(dps);
}
return values;
}
} }

View file

@ -73,6 +73,7 @@ public class JenaBaseDaoCon {
protected AnnotationProperty PROPERTY_CUSTOMENTRYFORMANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_CUSTOMENTRYFORMANNOT); protected AnnotationProperty PROPERTY_CUSTOMENTRYFORMANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_CUSTOMENTRYFORMANNOT);
protected AnnotationProperty PROPERTY_CUSTOMDISPLAYVIEWANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_CUSTOMDISPLAYVIEWANNOT); protected AnnotationProperty PROPERTY_CUSTOMDISPLAYVIEWANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_CUSTOMDISPLAYVIEWANNOT);
protected AnnotationProperty PROPERTY_CUSTOMSHORTVIEWANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_CUSTOMSHORTVIEWANNOT); protected AnnotationProperty PROPERTY_CUSTOMSHORTVIEWANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_CUSTOMSHORTVIEWANNOT);
protected AnnotationProperty PROPERTY_CUSTOM_LIST_VIEW_ANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_CUSTOM_LIST_VIEW_ANNOT);
protected AnnotationProperty PROPERTY_CUSTOMSEARCHVIEWANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_CUSTOMSEARCHVIEWANNOT); protected AnnotationProperty PROPERTY_CUSTOMSEARCHVIEWANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_CUSTOMSEARCHVIEWANNOT);
//protected AnnotationProperty PROPERTY_FORCESTUBDELETIONANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_FORCESTUBDELETIONANNOT); //protected AnnotationProperty PROPERTY_FORCESTUBDELETIONANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_FORCESTUBDELETIONANNOT);
protected AnnotationProperty PROPERTY_SELECTFROMEXISTINGANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_SELECTFROMEXISTINGANNOT); protected AnnotationProperty PROPERTY_SELECTFROMEXISTINGANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_SELECTFROMEXISTINGANNOT);

View file

@ -18,8 +18,11 @@ import com.hp.hpl.jena.ontology.OntProperty;
import com.hp.hpl.jena.ontology.OntResource; import com.hp.hpl.jena.ontology.OntResource;
import com.hp.hpl.jena.ontology.ProfileException; import com.hp.hpl.jena.ontology.ProfileException;
import com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory; import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.QuerySolutionMap;
import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.Literal;
import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.Property;
@ -35,6 +38,9 @@ import com.hp.hpl.jena.vocabulary.RDF;
import com.hp.hpl.jena.vocabulary.RDFS; import com.hp.hpl.jena.vocabulary.RDFS;
import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean; import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean;
import edu.cornell.mannlib.vitro.webapp.beans.DataProperty;
import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatementImpl;
import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement; import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement;
@ -851,6 +857,11 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp
} }
return properties; return properties;
} }
@Override
public String getCustomShortView() {
//return getPropertyStringValue(, PROPERTY_CUSTOM_LIST_VIEW_ANNOT);
return null;
}
} }

View file

@ -8,6 +8,13 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.QuerySolutionMap;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.ResourceFactory; import com.hp.hpl.jena.rdf.model.ResourceFactory;
@ -228,4 +235,40 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec
return 0; return 0;
} }
@Override
/*
* SPARQL-based method for getting the individual's values for a single data property.
*/
public List<ObjectPropertyStatement> getObjectPropertyStatementsForIndividualByProperty(Individual subject, ObjectProperty property, String queryString) {
log.debug("Object property query string: " + queryString);
Query query = null;
try {
query = QueryFactory.create(queryString);
} catch(Throwable th){
log.error("could not create SPARQL query for query string " + th.getMessage());
log.error(queryString);
}
String subjectUri = subject.getURI();
String propertyUri = property.getURI();
QuerySolutionMap bindings = new QuerySolutionMap();
bindings.add("subject", ResourceFactory.createResource(subjectUri));
bindings.add("property", ResourceFactory.createResource(propertyUri));
// Run the SPARQL query to get the properties
QueryExecution qexec = QueryExecutionFactory.create(query, getOntModelSelector().getFullModel(), bindings);
ResultSet results = qexec.execSelect();
List<ObjectPropertyStatement> statements = new ArrayList<ObjectPropertyStatement>();
while (results.hasNext()) {
QuerySolution sol = results.next();
Resource resource = sol.getResource("object");
ObjectPropertyStatement ops = new ObjectPropertyStatementImpl(subjectUri, propertyUri, resource.getURI());
statements.add(ops);
}
return statements;
}
} }

View file

@ -8,7 +8,9 @@ import java.util.List;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateModel { public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateModel {
@ -16,8 +18,8 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM
private List<SubclassList> subclassList; private List<SubclassList> subclassList;
CollatedObjectPropertyTemplateModel(ObjectProperty property) { CollatedObjectPropertyTemplateModel(ObjectProperty property, Individual subject, WebappDaoFactory wdf) {
super(property); super(property, subject, wdf);
subclassList = new ArrayList<SubclassList>(); subclassList = new ArrayList<SubclassList>();
} }

View file

@ -2,42 +2,106 @@
package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual; package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual;
import java.util.ArrayList; import java.io.File;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
public class ObjectPropertyTemplateModel extends PropertyTemplateModel { public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel {
private static final Log log = LogFactory.getLog(ObjectPropertyTemplateModel.class);
private static final Log log = LogFactory.getLog(ObjectPropertyTemplateModel.class);
private static final String TYPE = "object"; private static final String TYPE = "object";
private List<ObjectPropertyStatementTemplateModel> statements;
ObjectPropertyTemplateModel(ObjectProperty property) { private PropertyListConfig config;
super(property);
statements = new ArrayList<ObjectPropertyStatementTemplateModel>(); ObjectPropertyTemplateModel(ObjectProperty op, Individual subject, WebappDaoFactory wdf) {
super(op);
// get the statements from the db via sparql query
// Get the config for this object property
config = new PropertyListConfig(op);
} }
protected static ObjectPropertyTemplateModel getObjectPropertyTemplateModel(ObjectProperty op) { protected String getQueryString() {
return op.getCollateBySubclass() ? new CollatedObjectPropertyTemplateModel(op) return config.queryString;
: new ObjectPropertyTemplateModel(op);
} }
protected static ObjectPropertyTemplateModel getObjectPropertyTemplateModel(ObjectProperty op, Individual subject, WebappDaoFactory wdf) {
return op.getCollateBySubclass() ? new CollatedObjectPropertyTemplateModel(op, subject, wdf)
: new UncollatedObjectPropertyTemplateModel(op, subject, wdf);
}
private class PropertyListConfig {
private static final String DEFAULT_CONFIG_FILE = "objectPropertyList-default.xml";
private static final String CONFIG_FILE_PATH = "/views/";
private static final String NODE_NAME_QUERY = "query";
private static final String NODE_NAME_TEMPLATE = "template";
private String queryString;
private String templateName;
PropertyListConfig(ObjectProperty op) {
String filename = DEFAULT_CONFIG_FILE;;
// Get the config filename from ObjectPropertyDaoJena by looking for the custom property list view annotation.
// If there is none, use the default config filename.
// do stuff here to get the custom config filename ***
String configFilename = getConfigFilename(filename);
try {
File config = new File(configFilename);
if (configFilename != DEFAULT_CONFIG_FILE && ! config.exists()) {
log.warn("Can't find config file " + configFilename + " for object property " + op.getURI() + "\n" +
". Using default config file instead.");
configFilename = getConfigFilename(DEFAULT_CONFIG_FILE);
// Should we test for the existence of the default, and throw an error if it doesn't exist?
}
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(configFilename);
queryString = getConfigValue(doc, NODE_NAME_QUERY);
templateName = getConfigValue(doc, NODE_NAME_TEMPLATE);
} catch (Exception e) {
log.error("Error processing config file " + configFilename + " for object property " + op.getURI(), e);
// What should we do here?
}
}
private String getConfigValue(Document doc, String nodeName) {
NodeList nodes = doc.getElementsByTagName(nodeName);
Element element = (Element) nodes.item(0);
String value = element.getChildNodes().item(0).getNodeValue();
log.debug("Value of config parameter " + nodeName + " = " + value);
return value;
}
private String getConfigFilename(String filename) {
return servletContext.getRealPath(CONFIG_FILE_PATH + filename);
}
}
/* Access methods for templates */ /* Access methods for templates */
public String getType() { public String getType() {
return TYPE; return TYPE;
} }
public boolean isCollatedBySubclass() { public String getTemplate() {
return false; return config.templateName;
} }
public abstract boolean isCollatedBySubclass();
@Override @Override
public String getAddLink() { public String getAddLink() {
@ -58,9 +122,4 @@ public class ObjectPropertyTemplateModel extends PropertyTemplateModel {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return null; return null;
} }
public List<ObjectPropertyStatementTemplateModel> getStatements() {
// TODO Auto-generated method stub
return null;
}
} }

View file

@ -31,7 +31,7 @@ public class PropertyGroupTemplateModel extends BaseTemplateModel {
for (Property p : propertyList) { for (Property p : propertyList) {
if (p instanceof ObjectProperty) { if (p instanceof ObjectProperty) {
ObjectProperty op = (ObjectProperty)p; ObjectProperty op = (ObjectProperty)p;
properties.add(ObjectPropertyTemplateModel.getObjectPropertyTemplateModel(op)); properties.add(ObjectPropertyTemplateModel.getObjectPropertyTemplateModel(op, subject, wdf));
} else { } else {
properties.add(new DataPropertyTemplateModel((DataProperty)p, subject, wdf)); properties.add(new DataPropertyTemplateModel((DataProperty)p, subject, wdf));
} }

View file

@ -16,10 +16,12 @@ public abstract class PropertyTemplateModel extends BaseTemplateModel {
private static final Log log = LogFactory.getLog(PropertyTemplateModel.class); private static final Log log = LogFactory.getLog(PropertyTemplateModel.class);
private String name; private String name;
protected Property property; private String uri;
protected Property property; // needed to get the edit links
PropertyTemplateModel(Property property) { PropertyTemplateModel(Property property) {
this.name = property.getLabel(); this.name = property.getLabel();
this.uri = property.getURI();
this.property = property; this.property = property;
} }
@ -30,6 +32,10 @@ public abstract class PropertyTemplateModel extends BaseTemplateModel {
public String getName() { public String getName() {
return name; return name;
} }
public String getUri() {
return uri;
}
public abstract String getAddLink(); public abstract String getAddLink();

View file

@ -0,0 +1,47 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyStatementDao;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
public class UncollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateModel {
private static final Log log = LogFactory.getLog(UncollatedObjectPropertyTemplateModel.class);
private List<ObjectPropertyStatementTemplateModel> statements;
UncollatedObjectPropertyTemplateModel(ObjectProperty op, Individual subject, WebappDaoFactory wdf) {
super(op, subject, wdf);
ObjectPropertyStatementDao opDao = wdf.getObjectPropertyStatementDao();
List<ObjectPropertyStatement> opStatements = opDao.getObjectPropertyStatementsForIndividualByProperty(subject, op, getQueryString());
statements = new ArrayList<ObjectPropertyStatementTemplateModel>();
for (ObjectPropertyStatement ops : opStatements) {
statements.add(new ObjectPropertyStatementTemplateModel(ops));
}
}
public List<ObjectPropertyStatementTemplateModel> getStatements() {
return statements;
}
// public List<SubclassList> getStatements() {
// return subclassList;
// }
/* Access methods for templates */
@Override
public boolean isCollatedBySubclass() {
return false;
}
}

View file

@ -36,13 +36,16 @@
<#-- List the statements for each property --> <#-- List the statements for each property -->
<#if property.type == "data"> <#-- data property --> <#if property.type == "data"> <#-- data property -->
<#list property.statements as statement> <#list property.statements as statement>
<div class="dataprop-value"> <div class="data-prop-stmt-value">
${statement.value} ${statement.value}
</div> <!-- end dataprop-value --> </div> <!-- end data-prop-stmt-value -->
</#list> </#list>
<#else> <#-- object property --> <#else> <#-- object property -->
<p>Collated? ${property.collatedBySubclass?string("yes", "no")}</p> <p>Collated? ${property.collatedBySubclass?string("yes", "no")}</p>
<#if ! property.collatedBySubclass> <#-- temporary, till we handle collated props -->
<#include "${property.template}">
</#if>
</#if> </#if>
</div> <!-- end property --> </div> <!-- end property -->
</#list> </#list>

View file

@ -0,0 +1,10 @@
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
<#-- Default object property list template -->
<#list property.statements as statement>
<div class="obj-prop-stmt-obj">
<#-- ${statement.object.name} -->
statement ${statement_index +1}
</div> <!-- end obj-prop-stmt-obj -->
</#list>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
<view-config>
<query>
SELECT ?object WHERE {
?subject ?property ?object .
}
</query>
<template>objectPropertyList-default.ftl</template>
</view-config>