Skip to content

Commit

Permalink
add name of a list node to list value (#739)
Browse files Browse the repository at this point in the history
* feature (listNodeName) sparql template returns listNodeNames together with IRIs of listNodes

* feature (api v2): return name of a list node for a list value

* feature (knora api): add new list node name property to ontology and tests

* tests (list value api v2): add test for a list value node name to be returned

* refactor (list value): do not get the list nodes's label, just its name

* feature (return label of list node): return rdfs:label of a list node

- TODO: use SparqlExtendedConstructResponse and refactor ConstructResponseUtilV2.splitMainResourcesAndValueRdfData to handle multiple languages

* refactor (triplestore data): add decimal value type

* refactor (list value v2): serve a node's label

* tests (ontology v2): adapt prop name
  • Loading branch information
tobiasschweizer authored Mar 5, 2018
1 parent 24a442a commit ce4d11e
Show file tree
Hide file tree
Showing 14 changed files with 245 additions and 79 deletions.
128 changes: 74 additions & 54 deletions webapi/_test_data/all_data/anything-data.ttl

Large diffs are not rendered by default.

16 changes: 8 additions & 8 deletions webapi/_test_data/all_data/beol-data.ttl
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<http://rdfh.ch/beol/page_resource> a <http://www.knora.org/ontology/0801/beol#page> ;
rdfs:label "Test page" ;
<http://www.knora.org/ontology/knora-base#isDeleted> "false"^^xsd:boolean ;
<http://www.knora.org/ontology/knora-base#creationDate> "2017-09-01T15:21:10.735+02:00"^^xsd:dateTime ;
<http://www.knora.org/ontology/knora-base#creationDate> "2017-09-01T15:21:10.735+02:00"^^xsd:dateTimeStamp ;
<http://www.knora.org/ontology/knora-base#hasPermissions> "CR knora-base:Creator|M knora-base:ProjectMember|V knora-base:KnownUser|RV knora-base:UnknownUser" ;
<http://www.knora.org/ontology/knora-base#attachedToProject> <http://rdfh.ch/projects/0801> ;
<http://www.knora.org/ontology/knora-base#attachedToUser> <http://rdfh.ch/users/PSGbemdjZi4kQ6GHJVkLGF> .
Expand All @@ -33,7 +33,7 @@
<http://www.knora.org/ontology/knora-base#originalFilename> "808205.tif" ;
<http://www.knora.org/ontology/knora-base#originalMimeType> "image/tiff" ;
<http://www.knora.org/ontology/knora-base#qualityLevel> "100"^^xsd:integer ;
<http://www.knora.org/ontology/knora-base#valueCreationDate> "2017-09-01T15:21:10.735+02:00"^^xsd:dateTime ;
<http://www.knora.org/ontology/knora-base#valueCreationDate> "2017-09-01T15:21:10.735+02:00"^^xsd:dateTimeStamp ;
<http://www.knora.org/ontology/knora-base#valueHasOrder> "0"^^xsd:integer ;
<http://www.knora.org/ontology/knora-base#valueHasString> "808205.tif" ;
<http://www.knora.org/ontology/knora-base#hasPermissions> "M knora-base:Creator,knora-base:ProjectMember|V knora-base:KnownUser|RV knora-base:UnknownUser" ;
Expand All @@ -52,7 +52,7 @@
<http://www.knora.org/ontology/knora-base#originalFilename> "808205.tif" ;
<http://www.knora.org/ontology/knora-base#originalMimeType> "image/tiff" ;
<http://www.knora.org/ontology/knora-base#qualityLevel> "10"^^xsd:integer ;
<http://www.knora.org/ontology/knora-base#valueCreationDate> "2017-09-01T15:21:10.735+02:00"^^xsd:dateTime ;
<http://www.knora.org/ontology/knora-base#valueCreationDate> "2017-09-01T15:21:10.735+02:00"^^xsd:dateTimeStamp ;
<http://www.knora.org/ontology/knora-base#valueHasOrder> "1"^^xsd:integer ;
<http://www.knora.org/ontology/knora-base#valueHasString> "808205.tif" ;
<http://www.knora.org/ontology/knora-base#hasPermissions> "M knora-base:Creator,knora-base:ProjectMember|V knora-base:KnownUser|RV knora-base:UnknownUser" ;
Expand All @@ -68,7 +68,7 @@
rdf:subject <http://rdfh.ch/beol/page_resource> ;
rdf:predicate <http://www.knora.org/ontology/0801/beol#partOf> ;
rdf:object <http://rdfh.ch/beol/letter_resource> ;
<http://www.knora.org/ontology/knora-base#valueCreationDate> "2017-09-01T15:21:10.735+02:00"^^xsd:dateTime ;
<http://www.knora.org/ontology/knora-base#valueCreationDate> "2017-09-01T15:21:10.735+02:00"^^xsd:dateTimeStamp ;
<http://www.knora.org/ontology/knora-base#valueHasOrder> "0"^^xsd:integer ;
<http://www.knora.org/ontology/knora-base#valueHasRefCount> "1"^^xsd:integer ;
<http://www.knora.org/ontology/knora-base#valueHasString> "http://rdfh.ch/beol/letter_resource" ;
Expand All @@ -79,7 +79,7 @@

<http://rdfh.ch/beol/page_resource/values/f45WI-rpQTigeaJ84KZoBA> a <http://www.knora.org/ontology/knora-base#IntValue> ;
<http://www.knora.org/ontology/knora-base#isDeleted> "false"^^xsd:boolean ;
<http://www.knora.org/ontology/knora-base#valueCreationDate> "2017-09-01T15:21:10.735+02:00"^^xsd:dateTime ;
<http://www.knora.org/ontology/knora-base#valueCreationDate> "2017-09-01T15:21:10.735+02:00"^^xsd:dateTimeStamp ;
<http://www.knora.org/ontology/knora-base#valueHasInteger> "0"^^xsd:integer ;
<http://www.knora.org/ontology/knora-base#valueHasOrder> "0"^^xsd:integer ;
<http://www.knora.org/ontology/knora-base#valueHasString> "0" ;
Expand All @@ -90,16 +90,16 @@
<http://rdfh.ch/beol/letter_resource> a <http://www.knora.org/ontology/0801/beol#letter> ;
rdfs:label "Test letter" ;
<http://www.knora.org/ontology/knora-base#isDeleted> "false"^^xsd:boolean ;
<http://www.knora.org/ontology/knora-base#creationDate> "2017-09-01T14:15:04.846+02:00"^^xsd:dateTime ;
<http://www.knora.org/ontology/knora-base#lastModificationDate> "2017-09-01T15:21:16.480+02:00"^^xsd:dateTime ;
<http://www.knora.org/ontology/knora-base#creationDate> "2017-09-01T14:15:04.846+02:00"^^xsd:dateTimeStamp ;
<http://www.knora.org/ontology/knora-base#lastModificationDate> "2017-09-01T15:21:16.480+02:00"^^xsd:dateTimeStamp ;
<http://www.knora.org/ontology/knora-base#hasPermissions> "CR knora-base:Creator|M knora-base:ProjectMember|V knora-base:KnownUser|RV knora-base:UnknownUser" ;
<http://www.knora.org/ontology/knora-base#attachedToProject> <http://rdfh.ch/projects/0801> ;
<http://www.knora.org/ontology/knora-base#attachedToUser> <http://rdfh.ch/users/PSGbemdjZi4kQ6GHJVkLGF> ;
<http://www.knora.org/ontology/0801/beol#title> <http://rdfh.ch/beol/letter_resource/values/naiFCtV2S5C6GIe_eKGTGQ> .

<http://rdfh.ch/beol/letter_resource/values/naiFCtV2S5C6GIe_eKGTGQ> a <http://www.knora.org/ontology/knora-base#TextValue> ;
<http://www.knora.org/ontology/knora-base#isDeleted> "false"^^xsd:boolean ;
<http://www.knora.org/ontology/knora-base#valueCreationDate> "2017-09-01T14:15:04.846+02:00"^^xsd:dateTime ;
<http://www.knora.org/ontology/knora-base#valueCreationDate> "2017-09-01T14:15:04.846+02:00"^^xsd:dateTimeStamp ;
<http://www.knora.org/ontology/knora-base#valueHasOrder> "0"^^xsd:integer ;
<http://www.knora.org/ontology/knora-base#valueHasString> "Test letter" ;
<http://www.knora.org/ontology/knora-base#hasPermissions> "CR knora-base:Creator|M knora-base:ProjectMember|V knora-base:KnownUser|RV knora-base:UnknownUser" ;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -704,6 +704,7 @@ object OntologyConstants {
val BooleanValueAsBoolean: IRI = KnoraApiV2PrefixExpansion + "booleanValueAsBoolean"

val HierarchicalListValueAsListNode: IRI = KnoraApiV2PrefixExpansion + "hierarchicalListValueAsListNode"
val HierarchicalListValueAsListNodeLabel: IRI = KnoraApiV2PrefixExpansion + "hierarchicalListValueAsListNodeLabel"

val ColorValueAsColor: IRI = KnoraApiV2PrefixExpansion + "colorValueAsColor"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

package org.knora.webapi.messages.store.triplestoremessages

import java.time.Instant
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
import org.knora.webapi.util.ErrorHandlingMap
import org.knora.webapi.{IRI, InconsistentTriplestoreDataException, TriplestoreResponseException}
Expand Down Expand Up @@ -290,12 +291,30 @@ case class BooleanLiteralV2(value: Boolean) extends LiteralV2 {
/**
* Represents an integer value.
*
* @param value the boolean value.
* @param value the integer value.
*/
case class IntLiteralV2(value: Int) extends LiteralV2 {
override def toString: String = value.toString
}

/**
* Represents an Decimal value.
*
* @param value the decimal value.
*/
case class DecimalLiteralV2(value: BigDecimal) extends LiteralV2 {
override def toString: String = value.toString
}

/**
* Represents a timestamp.
*
* @param value the timestamp value.
*/
case class DateTimeLiteralV2(value: Instant) extends LiteralV2 {
override def toString: String = value.toString
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// JSON formatting

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ case class GeomValueContentV2(valueHasString: String, valueHasGeometry: String,
* @param valueHasString the string representation of the time interval.
* @param valueHasIntervalStart the start of the time interval.
* @param valueHasIntervalEnd the end of the time interval.
* @param comment a comment on this `GeomValueContentV2`, if any.
* @param comment a comment on this `IntervalValueContentV2`, if any.
*/
case class IntervalValueContentV2(valueHasString: String, valueHasIntervalStart: BigDecimal, valueHasIntervalEnd: BigDecimal, comment: Option[String]) extends ValueContentV2 {

Expand All @@ -344,16 +344,22 @@ case class IntervalValueContentV2(valueHasString: String, valueHasIntervalStart:
*
* @param valueHasString the string representation of the hierarchical list node value.
* @param valueHasListNode the IRI of the hierarchical list node pointed to.
* @param comment a comment on this `GeomValueContentV2`, if any.
* @param listNodeLabel the label of the hierarchical list node pointed to.
* @param comment a comment on this `HierarchicalListValueContentV2`, if any.
*/
case class HierarchicalListValueContentV2(valueHasString: String, valueHasListNode: IRI, comment: Option[String]) extends ValueContentV2 {
case class HierarchicalListValueContentV2(valueHasString: String, valueHasListNode: IRI, listNodeLabel: String, comment: Option[String]) extends ValueContentV2 {

def internalValueTypeIri: IRI = OntologyConstants.KnoraBase.ListValue

def toJsonLDValue(targetSchema: ApiV2Schema, settings: SettingsImpl): JsonLDValue = {
// TODO: check targetSchema and return JSON-LD accordingly.

JsonLDObject(Map(OntologyConstants.KnoraApiV2WithValueObjects.HierarchicalListValueAsListNode -> JsonLDString(valueHasListNode)))
JsonLDObject(
Map(
OntologyConstants.KnoraApiV2WithValueObjects.HierarchicalListValueAsListNode -> JsonLDString(valueHasListNode),
OntologyConstants.KnoraApiV2WithValueObjects.HierarchicalListValueAsListNodeLabel -> JsonLDString(listNodeLabel)
)
)
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1886,7 +1886,8 @@ object KnoraApiV2WithValueObjects {
)
),
directCardinalities = Map(
OntologyConstants.KnoraApiV2WithValueObjects.HierarchicalListValueAsListNode -> Cardinality.MustHaveOne
OntologyConstants.KnoraApiV2WithValueObjects.HierarchicalListValueAsListNode -> Cardinality.MustHaveOne,
OntologyConstants.KnoraApiV2WithValueObjects.HierarchicalListValueAsListNodeLabel -> Cardinality.MustHaveOne
),
inheritedCardinalities = Value.allCardinalities,
isValueClass = true
Expand Down Expand Up @@ -1914,6 +1915,28 @@ object KnoraApiV2WithValueObjects {
)
)

val HierarchicalListValueAsListNodeLabel: ReadPropertyInfoV2 = makeProperty(
propertyIri = OntologyConstants.KnoraApiV2WithValueObjects.HierarchicalListValueAsListNodeLabel,
propertyType = OntologyConstants.Owl.ObjectProperty,
subPropertyOf = Set(OntologyConstants.KnoraApiV2WithValueObjects.ValueHas),
subjectType = Some(OntologyConstants.KnoraApiV2WithValueObjects.ListValue),
objectType = Some(OntologyConstants.Xsd.String),
predicates = Seq(
makePredicate(
predicateIri = OntologyConstants.Rdfs.Label,
objectsWithLang = Map(
LanguageCodes.EN -> "Hierarchical list value as list node name"
)
),
makePredicate(
predicateIri = OntologyConstants.Rdfs.Comment,
objectsWithLang = Map(
LanguageCodes.EN -> "Represents the name of the list node pointed to."
)
)
)
)

val ColorValue: ReadClassInfoV2 = makeClass(
classIri = OntologyConstants.KnoraApiV2WithValueObjects.ColorValue,
subClassOf = Set(OntologyConstants.KnoraApiV2WithValueObjects.Value),
Expand Down Expand Up @@ -2587,6 +2610,7 @@ object KnoraApiV2WithValueObjects {
IntervalValueHasStart,
IntervalValueHasEnd,
HierarchicalListValueAsListNode,
HierarchicalListValueAsListNodeLabel,
ColorValueAsColor,
UriValueAsUri,
GeonameValueAsGeonameCode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import org.knora.webapi._
import org.knora.webapi.messages.store.triplestoremessages._
import org.knora.webapi.store.triplestore.RdfDataObjectFactory
import org.knora.webapi.util.ActorUtil._
import org.knora.webapi.util.FakeTriplestore
import org.knora.webapi.util.{FakeTriplestore, StringFormatter}
import org.knora.webapi.util.SparqlResultProtocol._
import spray.json._

Expand Down Expand Up @@ -241,12 +241,16 @@ class HttpTriplestoreConnector extends Actor with ActorLogging {
* @return a [[SparqlExtendedConstructResponse]]
*/
private def sparqlHttpExtendedConstruct(sparql: String): Future[SparqlExtendedConstructResponse] = {

// println(logDelimiter + sparql)

/**
* Converts a graph in parsed Turtle to a [[SparqlExtendedConstructResponse]].
*/
class ConstructResponseTurtleHandler extends RDFHandler {

private val stringFormatter = StringFormatter.getGeneralInstance

/**
* A collection of all the statements in the input file, grouped and sorted by subject IRI.
*/
Expand Down Expand Up @@ -279,6 +283,8 @@ class HttpTriplestoreConnector extends Actor with ActorLogging {
case OntologyConstants.Xsd.String => StringLiteralV2(value = literal.stringValue, language = None)
case OntologyConstants.Xsd.Boolean => BooleanLiteralV2(value = literal.booleanValue)
case OntologyConstants.Xsd.Integer | OntologyConstants.Xsd.NonNegativeInteger => IntLiteralV2(value = literal.intValue)
case OntologyConstants.Xsd.Decimal => DecimalLiteralV2(value = literal.decimalValue)
case OntologyConstants.Xsd.DateTimeStamp => DateTimeLiteralV2(stringFormatter.toInstant(literal.stringValue, throw InconsistentTriplestoreDataException(s"Invalid xsd:dateTimeStamp: ${literal.stringValue}")))
case unknown => throw NotImplementedException(s"The literal type '$unknown' is not implemented.")
}

Expand Down
Loading

0 comments on commit ce4d11e

Please sign in to comment.