From 4edc27cc64000e599b4b89db8ace1eee7e088908 Mon Sep 17 00:00:00 2001 From: Benjamin Geer Date: Thu, 4 Feb 2021 19:46:28 +0100 Subject: [PATCH] fix(api-v1): Optimise SPARQL queries. (#1814) --- .../sparql/v1/findResourceWithValue.scala.txt | 11 ++++-- .../sparql/v1/findValueInVersions.scala.txt | 39 +++++++++++++------ .../sparql/v1/getContextStandard.scala.txt | 26 +++++++++---- .../getIncomingReferencesStandard.scala.txt | 19 ++++++--- .../sparql/v1/getRegionsStandard.scala.txt | 14 ++++--- ...ourcePropertiesAndValuesStandard.scala.txt | 37 +++++++++++++----- .../getResourceSearchResultStandard.scala.txt | 8 +++- .../v1/getResourcesByProjectAndType.scala.txt | 5 ++- .../sparql/v1/getValueStandard.scala.txt | 24 +++++++++--- .../v1/getVersionHistoryStandard.scala.txt | 11 ++++-- .../sparql/v1/isPartOfStandard.scala.txt | 10 ++++- .../sparql/v1/searchExtendedGraphDB.scala.txt | 1 - .../v1/searchExtendedStandard.scala.txt | 12 +++--- .../v1/searchFulltextStandard.scala.txt | 9 ++++- 14 files changed, 162 insertions(+), 64 deletions(-) diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/findResourceWithValue.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/findResourceWithValue.scala.txt index 3bb251e5f1..6cf34db1a9 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/findResourceWithValue.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/findResourceWithValue.scala.txt @@ -40,14 +40,19 @@ SELECT ?resource ?project ?property WHERE { BIND(IRI("@searchValueIri") as ?searchValue) - ?searchValue knora-base:isDeleted false . - @* Find something that links to searchValue, and make sure it's a Resource. *@ ?resource ?property ?searchValue ; - knora-base:isDeleted false ; rdf:type ?resourceClass . ?resourceClass rdfs:subClassOf* knora-base:Resource . ?property rdfs:subPropertyOf* knora-base:hasValue . ?resource knora-base:attachedToProject ?project . + + FILTER NOT EXISTS { + ?searchValue knora-base:isDeleted true . + } + + FILTER NOT EXISTS { + ?resource knora-base:isDeleted true . + } } diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/findValueInVersions.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/findValueInVersions.scala.txt index 9ebd2e62f1..11601c75e7 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/findValueInVersions.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/findValueInVersions.scala.txt @@ -43,17 +43,23 @@ SELECT ?objPred ?objObj ?predStandoff ?objStandoff FROM } WHERE { - BIND(IRI("@resourceIri") as ?resource) - BIND(IRI("@propertyIri") as ?property) - BIND(IRI("@searchValueIri") as ?searchValue) - { - ?resource ?property ?currentValue ; - knora-base:isDeleted false . - ?currentValue knora-base:previousValue* ?searchValue ; - knora-base:isDeleted false . + BIND(IRI("@resourceIri") as ?resource) + BIND(IRI("@propertyIri") as ?property) + BIND(IRI("@searchValueIri") as ?searchValue) + + ?resource ?property ?currentValue . + ?currentValue knora-base:previousValue* ?searchValue . ?searchValue ?objPred ?objObj . + FILTER NOT EXISTS { + ?resource knora-base:isDeleted true . + } + + FILTER NOT EXISTS { + ?currentValue knora-base:isDeleted true . + } + FILTER(?objPred != knora-base:attachedToProject) OPTIONAL { @@ -63,11 +69,22 @@ WHERE { } UNION { + BIND(IRI("@resourceIri") as ?resource) + BIND(IRI("@propertyIri") as ?property) + BIND(IRI("@searchValueIri") as ?searchValue) + ?resource ?property ?currentValue ; - knora-base:isDeleted false ; knora-base:attachedToProject ?resourceProject . - ?currentValue knora-base:previousValue* ?searchValue ; - knora-base:isDeleted false . + + ?currentValue knora-base:previousValue* ?searchValue . + + FILTER NOT EXISTS { + ?resource knora-base:isDeleted true . + } + + FILTER NOT EXISTS { + ?currentValue knora-base:isDeleted true . + } @* Return the project of the resource that contains the value. *@ diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getContextStandard.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getContextStandard.scala.txt index 4611001953..275248b7ac 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getContextStandard.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getContextStandard.scala.txt @@ -56,8 +56,7 @@ SELECT ?sourceObject WHERE { BIND(IRI("@resourceIri") as ?resource) - ?resource rdf:type ?resourceClass ; - knora-base:isDeleted false . + ?resource rdf:type ?resourceClass . ?resourceClass rdfs:subClassOf* knora-base:Resource . @@ -65,8 +64,7 @@ WHERE { ?linkingProp rdfs:subPropertyOf* knora-base:isPartOf . - ?sourceObject ?linkingProp ?resource ; - knora-base:isDeleted false . + ?sourceObject ?linkingProp ?resource . OPTIONAL { ?seqProp rdfs:subPropertyOf* knora-base:seqnum . @@ -87,16 +85,30 @@ WHERE { rdf:subject ?sourceObject ; rdf:predicate ?linkingProp ; rdf:object ?resource ; - knora-base:isDeleted false ; knora-base:attachedToUser ?linkValueCreator ; knora-base:hasPermissions ?linkValuePermissions . + FILTER NOT EXISTS { + ?resource knora-base:isDeleted true . + } + + FILTER NOT EXISTS { + ?sourceObject knora-base:isDeleted true . + } + + FILTER NOT EXISTS { + ?linkValue knora-base:isDeleted true . + } + OPTIONAL { ?fileValueProp rdfs:subPropertyOf* knora-base:hasFileValue . ?sourceObject ?fileValueProp ?fileValue . - ?fileValue a knora-base:StillImageFileValue ; - knora-base:isDeleted false . + ?fileValue a knora-base:StillImageFileValue . + + FILTER NOT EXISTS { + ?fileValue knora-base:isDeleted true . + } ?fileValue knora-base:internalMimeType ?internalMimeType ; knora-base:originalFilename ?originalFilename ; diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getIncomingReferencesStandard.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getIncomingReferencesStandard.scala.txt index cfc660a70a..ffa1960c47 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getIncomingReferencesStandard.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getIncomingReferencesStandard.scala.txt @@ -52,17 +52,21 @@ WHERE { BIND(IRI("@resourceIri") as ?resource) - ?resource knora-base:isDeleted false . - ?linkProp rdfs:subPropertyOf* knora-base:hasLinkTo . FILTER NOT EXISTS { ?linkProp rdfs:subPropertyOf* knora-base:isPartOf . } - ?referringResource ?linkProp ?resource ; - knora-base:isDeleted false . + FILTER NOT EXISTS { + ?resource knora-base:isDeleted true . + } + ?referringResource ?linkProp ?resource . + + FILTER NOT EXISTS { + ?referringResource knora-base:isDeleted true . + } } LIMIT 50 } @@ -84,8 +88,11 @@ WHERE { ?prop rdfs:subPropertyOf* knora-base:hasLinkToValue . ?referringResource ?prop ?obj . - ?obj knora-base:isDeleted false ; - ?objPred ?objObj . + ?obj ?objPred ?objObj . + + FILTER NOT EXISTS { + ?obj knora-base:isDeleted true . + } BIND(true as ?isLinkValue) } diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getRegionsStandard.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getRegionsStandard.scala.txt index 6e01f03cf5..2d4f2cee32 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getRegionsStandard.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getRegionsStandard.scala.txt @@ -38,17 +38,21 @@ PREFIX rdf: SELECT ?region ?resclass ?regionObjectPermissions ?owner ?project WHERE { BIND(IRI("@resourceIri") as ?resource) - ?resource knora-base:isDeleted false . - ?linkingProp rdfs:subPropertyOf* knora-base:isRegionOf . ?region ?linkingProp ?resource . - ?region knora-base:isDeleted false . - - ?region a ?resclass . ?resclass rdfs:subClassOf* knora-base:Region . + ?region a ?resclass . ?region knora-base:attachedToUser ?owner ; knora-base:attachedToProject ?project ; knora-base:hasPermissions ?regionObjectPermissions . + + FILTER NOT EXISTS { + ?resource knora-base:isDeleted true . + } + + FILTER NOT EXISTS { + ?region knora-base:isDeleted true . + } } diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getResourcePropertiesAndValuesStandard.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getResourcePropertiesAndValuesStandard.scala.txt index 97b8e4df7d..0c0ce58a9b 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getResourcePropertiesAndValuesStandard.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getResourcePropertiesAndValuesStandard.scala.txt @@ -38,10 +38,13 @@ SELECT ?prop ?isLinkProp ?isLinkValueProp ?obj ?objPred ?objObj ?predStandoff ?o WHERE { BIND(IRI("@resourceIri") as ?resource) - ?resource rdf:type ?resourceClass ; - knora-base:isDeleted false . + ?resource rdf:type ?resourceClass . ?resourceClass rdfs:subClassOf* knora-base:Resource . + FILTER NOT EXISTS { + ?resource knora-base:isDeleted true . + } + { @* Get properties that point to Value objects. *@ @@ -63,20 +66,28 @@ WHERE { @* Get the project of the containing resource. *@ ?resource ?prop ?obj . - ?obj knora-base:isDeleted false . + + FILTER NOT EXISTS { + ?obj knora-base:isDeleted true . + } + ?resource knora-base:attachedToProject ?resourceProject . BIND(knora-base:attachedToProject AS ?objPred) - BIND(COALESCE(?valueProject, ?resourceProject) AS ?objObj) + BIND(COALESCE(?valueProject, ?resourceProject) AS ?objObj) } UNION { @* Get the value's standoff markup nodes if it has any. *@ ?resource ?prop ?obj . - ?obj knora-base:isDeleted false . + + FILTER NOT EXISTS { + ?obj knora-base:isDeleted true . + } + ?obj a knora-base:TextValue . BIND(knora-base:valueHasStandoff AS ?objPred) - ?obj ?objPred ?objObj . + ?obj ?objPred ?objObj . ?objObj ?predStandoff ?objStandoff . } UNION @@ -84,8 +95,12 @@ WHERE { @* Get any other statements about the value. *@ ?resource ?prop ?obj . - ?obj knora-base:isDeleted false . - ?obj ?objPred ?objObj . + + FILTER NOT EXISTS { + ?obj knora-base:isDeleted true . + } + + ?obj ?objPred ?objObj . FILTER(!(?objPred = knora-base:attachedToProject || ?objPred = knora-base:valueHasStandoff)) } @@ -98,7 +113,11 @@ WHERE { BIND(true AS ?isLinkProp) ?resource ?prop ?obj . - ?obj knora-base:isDeleted false . + + FILTER NOT EXISTS { + ?obj knora-base:isDeleted true . + } + ?obj ?objPred ?objObj . } } diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getResourceSearchResultStandard.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getResourceSearchResultStandard.scala.txt index b27e74bda2..b797a0b1be 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getResourceSearchResultStandard.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getResourceSearchResultStandard.scala.txt @@ -68,7 +68,9 @@ WHERE { } } - ?resourceIri knora-base:isDeleted false . + FILTER NOT EXISTS { + ?resourceIri knora-base:isDeleted true . + } @restypeIriOption match { @@ -98,9 +100,11 @@ WHERE { ?resourceIri ?property ?valueObjectIri . ?property knora-base:objectClassConstraint knora-base:TextValue . ?valueObjectIri knora-base:valueHasString ?valueString ; - knora-base:isDeleted false ; knora-base:valueHasOrder ?valueOrder . + FILTER NOT EXISTS { + ?valueObjectIri knora-base:isDeleted true . + } } } diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getResourcesByProjectAndType.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getResourcesByProjectAndType.scala.txt index e786004130..f24b3c3119 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getResourcesByProjectAndType.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getResourcesByProjectAndType.scala.txt @@ -43,6 +43,9 @@ WHERE { BIND(IRI("@resType") as ?resType) ?s rdf:type ?resType ; - knora-base:isDeleted false ; knora-base:attachedToProject ?projectIri . + + FILTER NOT EXISTS { + ?s knora-base:isDeleted true . + } } \ No newline at end of file diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getValueStandard.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getValueStandard.scala.txt index bf776aca33..10bf7c62e1 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getValueStandard.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getValueStandard.scala.txt @@ -41,10 +41,16 @@ WHERE { ?resourceProp rdfs:subPropertyOf* knora-base:hasValue . { - ?resource ?resourceProp ?obj ; - knora-base:isDeleted false . + ?resource ?resourceProp ?obj . + + FILTER NOT EXISTS { + ?resource knora-base:isDeleted true . + } + + FILTER NOT EXISTS { + ?obj knora-base:isDeleted true . + } - ?obj knora-base:isDeleted false . ?obj ?objPred ?objObj . FILTER(?objPred != knora-base:attachedToProject) @@ -58,10 +64,16 @@ WHERE { { @* Return the project of the resource that contains the value. *@ - ?resource ?resourceProp ?obj ; - knora-base:isDeleted false . + ?resource ?resourceProp ?obj . + + FILTER NOT EXISTS { + ?resource knora-base:isDeleted true . + } + + FILTER NOT EXISTS { + ?obj knora-base:isDeleted true . + } - ?obj knora-base:isDeleted false . ?resource knora-base:attachedToProject ?resourceProject . BIND(knora-base:attachedToProject AS ?objPred) diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getVersionHistoryStandard.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getVersionHistoryStandard.scala.txt index db7087d871..e616867df5 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getVersionHistoryStandard.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/getVersionHistoryStandard.scala.txt @@ -46,10 +46,11 @@ WHERE { BIND(IRI("@propertyIri") AS ?prop) BIND(IRI("@currentValueIri") AS ?currentValue) - ?resource knora-base:isDeleted false . + ?currentValue knora-base:hasPermissions ?valuePermissions . - ?currentValue knora-base:isDeleted false ; - knora-base:hasPermissions ?valuePermissions . + FILTER NOT EXISTS { + ?currentValue knora-base:isDeleted true . + } ?resource ?prop ?currentValue . ?prop rdfs:subPropertyOf* knora-base:hasValue . @@ -57,6 +58,10 @@ WHERE { ?currentValue knora-base:previousValue* ?value . + FILTER NOT EXISTS { + ?resource knora-base:isDeleted true . + } + OPTIONAL { ?value knora-base:valueCreationDate ?valueCreationDate . } diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/isPartOfStandard.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/isPartOfStandard.scala.txt index 8bfb4351b7..77c8f2d552 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/isPartOfStandard.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/isPartOfStandard.scala.txt @@ -39,12 +39,15 @@ SELECT ?containingResource ?containingResourceProject ?linkValue ?linkValueCreat WHERE { BIND(IRI("@resourceIri") as ?resource) - ?resource knora-base:isDeleted false . ?linkingProp rdfs:subPropertyOf* knora-base:isPartOf . ?resource ?linkingProp ?containingResource . ?containingResource knora-base:isDeleted false ; knora-base:attachedToProject ?containingResourceProject . + FILTER NOT EXISTS { + ?resource knora-base:isDeleted true . + } + BIND(IRI(CONCAT(STR(?linkingProp), "Value")) AS ?linkValueProp) ?resource ?linkValueProp ?linkValue . @@ -53,8 +56,11 @@ WHERE { rdf:subject ?resource ; rdf:predicate ?linkingProp ; rdf:object ?containingResource ; - knora-base:isDeleted false ; knora-base:attachedToUser ?linkValueCreator ; knora-base:hasPermissions ?linkValuePermissions . + + FILTER NOT EXISTS { + ?linkValue knora-base:isDeleted true . + } } LIMIT 1 diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedGraphDB.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedGraphDB.scala.txt index decdba11ac..b4788cb149 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedGraphDB.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedGraphDB.scala.txt @@ -627,7 +627,6 @@ WHERE { OPTIONAL { ?resource knora-base:hasStillImageFileValue ?fileValue . ?fileValue a knora-base:StillImageFileValue . - ?fileValue knora-base:isPreview true . ?fileValue knora-base:internalFilename ?previewPath . OPTIONAL { diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedStandard.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedStandard.scala.txt index bb4666347e..85c89c1ef7 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedStandard.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedStandard.scala.txt @@ -569,8 +569,6 @@ WHERE { knora-base:hasPermissions ?valuePermissions@index . } - ?resource knora-base:isDeleted false . - @projectIriOption match { case Some(projectIri) => { @@ -582,8 +580,6 @@ WHERE { case None => {} } - ?resource a ?resourceClass . - @restypeIriOption match { case Some(restypeIri) => { @@ -620,7 +616,6 @@ WHERE { OPTIONAL { ?resource knora-base:hasStillImageFileValue ?fileValue . ?fileValue a knora-base:StillImageFileValue . - ?fileValue knora-base:isPreview true . ?fileValue knora-base:internalFilename ?previewPath . OPTIONAL { @@ -629,7 +624,12 @@ WHERE { } } - ?resource knora-base:hasPermissions ?resourcePermissions ; + FILTER NOT EXISTS { + ?resource knora-base:isDeleted true . + } + + ?resource a ?resourceClass ; + knora-base:hasPermissions ?resourcePermissions ; knora-base:attachedToUser ?resourceCreator ; knora-base:attachedToProject ?resourceProject . } diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchFulltextStandard.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchFulltextStandard.scala.txt index a4107daeaf..c7db951e5c 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchFulltextStandard.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchFulltextStandard.scala.txt @@ -80,7 +80,9 @@ WHERE { } } - ?matchingSubject knora-base:isDeleted false . + FILTER NOT EXISTS { + ?matchingSubject knora-base:isDeleted true . + } # ?matchingSubject could be a resource (whose rdfs:label matched) or a value object @@ -93,7 +95,10 @@ WHERE { ?resourceProperty rdfs:subPropertyOf* knora-base:hasValue . FILTER(?valueObjectType != knora-base:LinkValue) - ?containingResource knora-base:isDeleted false . + + FILTER NOT EXISTS { + ?containingResource knora-base:isDeleted true . + } BIND(?matchingSubject AS ?valueObject)