From 389feb49b504f619b2164befd9c54e5595e06cb6 Mon Sep 17 00:00:00 2001 From: Benjamin Geer Date: Thu, 10 Dec 2020 13:59:59 +0100 Subject: [PATCH] chore(rdf-api): Use the Jena RDF API implementation by default (DSP-1153) (#1772) --- .../05-internals/design/principles/rdf-api.md | 4 ++ webapi/src/main/resources/application.conf | 2 +- .../util/rdf/jenaimpl/JenaModel.scala | 13 ++++- .../messages/util/rdf/RdfModelSpec.scala | 21 ++++---- .../plugins/UpgradePluginPR1307Spec.scala | 53 ++++++++++--------- .../plugins/UpgradePluginPR1372Spec.scala | 17 +++--- .../plugins/UpgradePluginPR1615Spec.scala | 20 ++++--- .../upgrade/plugins/UpgradePluginSpec.scala | 2 +- 8 files changed, 79 insertions(+), 53 deletions(-) diff --git a/docs/05-internals/design/principles/rdf-api.md b/docs/05-internals/design/principles/rdf-api.md index a4201fe29d..f44a22bc1d 100644 --- a/docs/05-internals/design/principles/rdf-api.md +++ b/docs/05-internals/design/principles/rdf-api.md @@ -86,6 +86,10 @@ In tests, it can be useful to run SPARQL queries to check the content of an `RdfModel`. To do this, use the `RdfModel.asRepository` method, which returns an `RdfRepository` that can run `SELECT` queries. +The configuration of the default graph depends on which underlying +RDF library is used. If you are querying data in named graphs, use `FROM` +or quad patterns rather than the default graph. + ## SHACL validation diff --git a/webapi/src/main/resources/application.conf b/webapi/src/main/resources/application.conf index 72899f8f22..0a419e76dc 100644 --- a/webapi/src/main/resources/application.conf +++ b/webapi/src/main/resources/application.conf @@ -285,7 +285,7 @@ app { available-versions = [ 1 ] default-version = 1 - enabled-by-default = no + enabled-by-default = yes override-allowed = yes developer-emails = [ diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModel.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModel.scala index a4ecc9d132..4c8625bc09 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModel.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/jenaimpl/JenaModel.scala @@ -458,7 +458,18 @@ class JenaRepository(private val dataset: jena.query.Dataset) extends RdfReposit val varNames: Iterator[String] = querySolution.varNames.asScala val rowMap: Map[String, String] = varNames.map { varName => - varName -> querySolution.get(varName).asNode.toString + val varValue: jena.graph.Node = querySolution.get(varName).asNode + + // Is the value a literal? + val varValueStr: String = if (varValue.isLiteral) { + // Yes. Get its lexical form, i.e. don't include its datatype in its string representation. + varValue.getLiteralLexicalForm + } else { + // No, it's an IRI or blank node ID, so its string representation is OK. + varValue.toString + } + + varName -> varValueStr }.toMap rowBuffer.append(VariableResultsRow(new ErrorHandlingMap[String, String](rowMap, { key: String => diff --git a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfModelSpec.scala b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfModelSpec.scala index 90ad1adee7..1eef07fcb6 100644 --- a/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfModelSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/messages/util/rdf/RdfModelSpec.scala @@ -315,27 +315,30 @@ abstract class RdfModelSpec(featureToggle: FeatureToggle) extends CoreSpec { val rdfRepository: RdfRepository = anythingModel.asRepository val selectQuery = - """PREFIX knora-base: - |PREFIX anything: - | - |SELECT ?resource ?value WHERE { - | ?resource anything:hasDecimal ?value . - |} ORDER BY ?resource""".stripMargin + """PREFIX anything: + |PREFIX knora-base: + | + |SELECT ?resource ?value ?decimalValue WHERE { + | ?resource anything:hasDecimal ?value . + | ?value knora-base:valueHasDecimal ?decimalValue . + |} ORDER BY ?resource""".stripMargin val queryResult: SparqlSelectResult = rdfRepository.doSelect(selectQuery) - assert(queryResult.head.vars == Seq("resource", "value")) + assert(queryResult.head.vars == Seq("resource", "value", "decimalValue")) val results: Seq[Map[String, String]] = queryResult.results.bindings.map(_.rowMap) val expectedResults = Seq( Map( "resource" -> "http://rdfh.ch/0001/H6gBWUuJSuuO-CilHV8kQw", - "value" -> "http://rdfh.ch/0001/H6gBWUuJSuuO-CilHV8kQw/values/bXMwnrHvQH2DMjOFrGmNzg" + "value" -> "http://rdfh.ch/0001/H6gBWUuJSuuO-CilHV8kQw/values/bXMwnrHvQH2DMjOFrGmNzg", + "decimalValue" -> "1.5" ), Map( "resource" -> "http://rdfh.ch/0001/uqmMo72OQ2K2xe7mkIytlg", - "value" -> "http://rdfh.ch/0001/uqmMo72OQ2K2xe7mkIytlg/values/85et-o-STOmn2JcVqrGTCQ" + "value" -> "http://rdfh.ch/0001/uqmMo72OQ2K2xe7mkIytlg/values/85et-o-STOmn2JcVqrGTCQ", + "decimalValue" -> "2.1" ) ) diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1307Spec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1307Spec.scala index 8df04ca4a1..adf19411ce 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1307Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1307Spec.scala @@ -37,13 +37,14 @@ class UpgradePluginPR1307Spec extends UpgradePluginSpec { // Check that knora-base:valueHasMaxStandoffStartIndex was added. val query1: String = - """ - |PREFIX knora-base: - | - |SELECT ?s ?maxStartIndex WHERE { - | ?s knora-base:valueHasMaxStandoffStartIndex ?maxStartIndex . - |} - |""".stripMargin + """PREFIX knora-base: + | + |SELECT ?s ?maxStartIndex + |FROM + |WHERE { + | ?s knora-base:valueHasMaxStandoffStartIndex ?maxStartIndex . + |} + |""".stripMargin val queryResult1: SparqlSelectResult = repository.doSelect(selectQuery = query1) @@ -61,13 +62,14 @@ class UpgradePluginPR1307Spec extends UpgradePluginSpec { // Check that the standoff tags' IRIs were changed correctly. val query2: String = - """ - |PREFIX knora-base: - | - |SELECT ?tag WHERE { - | knora-base:valueHasStandoff ?tag . - |} ORDER BY ?tag - |""".stripMargin + """PREFIX knora-base: + | + |SELECT ?tag + |FROM + |WHERE { + | knora-base:valueHasStandoff ?tag . + |} ORDER BY ?tag + |""".stripMargin val queryResult2: SparqlSelectResult = repository.doSelect(selectQuery = query2) @@ -89,17 +91,18 @@ class UpgradePluginPR1307Spec extends UpgradePluginSpec { // Check that the objects of knora-base:standoffTagHasStartParent were changed correctly. val query3: String = - """ - |PREFIX knora-base: - | - |SELECT ?tag ?startIndex ?startParent WHERE { - | ?tag knora-base:standoffTagHasStartIndex ?startIndex . - | - | OPTIONAL { - | ?tag knora-base:standoffTagHasStartParent ?startParent . - | } - |} ORDER BY ?tag - |""".stripMargin + """PREFIX knora-base: + | + |SELECT ?tag ?startIndex ?startParent + |FROM + |WHERE { + | ?tag knora-base:standoffTagHasStartIndex ?startIndex . + | + | OPTIONAL { + | ?tag knora-base:standoffTagHasStartParent ?startParent . + | } + |} ORDER BY ?tag + |""".stripMargin val queryResult3: SparqlSelectResult = repository.doSelect(selectQuery = query3) diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1372Spec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1372Spec.scala index 3145305035..0c95c5595c 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1372Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1372Spec.scala @@ -37,14 +37,15 @@ class UpgradePluginPR1372Spec extends UpgradePluginSpec { // Check that permissions were removed. val query: String = - """ - |PREFIX knora-base: - | - |SELECT ?value WHERE { - | ?value knora-base:valueCreationDate ?creationDate ; - | knora-base:hasPermissions ?permissions . - |} ORDER BY ?value - |""".stripMargin + """PREFIX knora-base: + | + |SELECT ?value + |FROM + |WHERE { + | ?value knora-base:valueCreationDate ?creationDate ; + | knora-base:hasPermissions ?permissions . + |} ORDER BY ?value + |""".stripMargin val queryResult1: SparqlSelectResult = repository.doSelect(selectQuery = query) diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1615Spec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1615Spec.scala index c10a5f956c..4c19897a68 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1615Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginPR1615Spec.scala @@ -37,10 +37,12 @@ class UpgradePluginPR1615Spec extends UpgradePluginSpec { // Check that was removed. val query1: String = - """SELECT ?p ?o WHERE { - | ?p ?o . - |} - |""".stripMargin + """SELECT ?p ?o + |FROM + |WHERE { + | ?p ?o . + |} + |""".stripMargin val queryResult1: SparqlSelectResult = repository.doSelect(selectQuery = query1) assert(queryResult1.results.bindings.isEmpty) @@ -48,10 +50,12 @@ class UpgradePluginPR1615Spec extends UpgradePluginSpec { // Check that other data is still there. val query2: String = - """SELECT ?p ?o WHERE { - | ?p ?o . - |} - |""".stripMargin + """SELECT ?p ?o + |FROM + |WHERE { + | ?p ?o . + |} + |""".stripMargin val queryResult2: SparqlSelectResult = repository.doSelect(selectQuery = query2) assert(queryResult2.results.bindings.nonEmpty) diff --git a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginSpec.scala b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginSpec.scala index 774b9546ad..be16661890 100644 --- a/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/store/triplestore/upgrade/plugins/UpgradePluginSpec.scala @@ -29,7 +29,7 @@ import org.knora.webapi.messages.util.rdf._ * Provides helper methods for specs that test upgrade plugins. */ abstract class UpgradePluginSpec extends CoreSpec() { - private val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(defaultFeatureFactoryConfig) + protected val rdfFormatUtil: RdfFormatUtil = RdfFeatureFactory.getRdfFormatUtil(defaultFeatureFactoryConfig) /** * Parses a TriG file and returns it as an [[RdfModel]].