SPARQL Query With Property Path Has Poor Performance (Doc ID 1574510.1)

Last updated on FEBRUARY 08, 2017

Applies to:

Oracle Spatial - Version 11.2.0.3 and later
Information in this document applies to any platform.

Symptoms

SPARQL Query with property path has poor performance

We have a SPARQL query containing a property path with a + at the end : (fim:fraOrganisasjonsrelasjon/fim:fraRolleOrganisasjonselement)+

The query runs for about 5 minutes before the result is returned. If we modify the query to use explicit paths (see attached file), it returns the result in under 2 seconds, but this solution is not very flexible. We would like to be able to use the original form of the SPARQL query, but we cannot wait for 5 minutes. The original SPARQL query seems to be translated to a lot of SQL statements. Any suggestions?

Original:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX fim: <http://nav.no/organisasjon/vocab/>

CONSTRUCT
  { <http://nav.no/organisasjon/Organisasjonsenhet/1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> fim:Organisasjonsenhet .
  <http://nav.no/organisasjon/Organisasjonsenhet/1> fim:aarsverk ?aarsverk .}
WHERE
  { SELECT (( sum(?prosentCasted) / 100 ) AS ?aarsverk)
  WHERE
  { ?ressurs fim:erTilknyttetVia ?organisasjonstilknytning .
  ?ressurs fim:beregnetAktiv true .
  ?organisasjonstilknytning <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> fim:Stilling .
  ?organisasjonstilknytning fim:gyldighetsperiode ?tilknPeriode .
  ?organisasjonstilknytning fim:stillingsprosent ?prosent .
  ?organisasjonstilknytning fim:inneharOrganisasjonsStilling ?organisasjonselementStillingURI .
  ?organisasjonselementStillingURI <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> fim:OrganisasjonselementStilling .
  ?organisasjonselementStillingURI fim:gyldighetsperiode ?allokeringPeriode .
  ?tilknPeriode fim:fom ?fraDato .
  ?tilknPeriode fim:tom ?tilDato .
  ?allokeringPeriode <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> fim:Periode .
  ?allokeringPeriode fim:fom ?allokeringFraDato .
  ?allokeringPeriode fim:tom ?allokeringTilDato
  { ?organisasjonselementStillingURI fim:harStillingIOrganisasjonselement <http://nav.no/organisasjon/Organisasjonsenhet/1> }
  UNION
  { ?organisasjonselementStillingURI fim:harStillingIOrganisasjonselement ?tilknyttetOrgenhet .
  ?tilknyttetOrgenhet (fim:fraOrganisasjonsrelasjon/fim:fraRolleOrganisasjonselement)+ <http://nav.no/organisasjon/Organisasjonsenhet/1>
  }
  BIND(xsd:float(?prosent) AS ?prosentCasted)
  FILTER ( ( now() >= xsd:dateTime(?fraDato) ) && ( now()   FILTER ( ( now() >= xsd:dateTime(?allokeringFraDato) ) && ( now()   }
  }

---

Modified:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX fim: <http://nav.no/organisasjon/vocab/>

CONSTRUCT
  { <http://nav.no/organisasjon/Organisasjonsenhet/1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> fim:Organisasjonsenhet .
  <http://nav.no/organisasjon/Organisasjonsenhet/1> fim:aarsverk ?aarsverk .}
WHERE
  { SELECT (( sum(?prosentCasted) / 100 ) AS ?aarsverk)
  WHERE
  { ?ressurs fim:erTilknyttetVia ?organisasjonstilknytning .
  ?ressurs fim:beregnetAktiv true .
  ?organisasjonstilknytning <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> fim:Stilling .
  ?organisasjonstilknytning fim:gyldighetsperiode ?tilknPeriode .
  ?organisasjonstilknytning fim:stillingsprosent ?prosent .
  ?organisasjonstilknytning fim:inneharOrganisasjonsStilling ?organisasjonselementStillingURI .
  ?organisasjonselementStillingURI <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> fim:OrganisasjonselementStilling .
  ?organisasjonselementStillingURI fim:gyldighetsperiode ?allokeringPeriode .
  ?tilknPeriode fim:fom ?fraDato .
  ?tilknPeriode fim:tom ?tilDato .
  ?allokeringPeriode <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> fim:Periode .
  ?allokeringPeriode fim:fom ?allokeringFraDato .
  ?allokeringPeriode fim:tom ?allokeringTilDato
  { ?organisasjonselementStillingURI fim:harStillingIOrganisasjonselement <http://nav.no/organisasjon/Organisasjonsenhet/1> }
  UNION
  { ?organisasjonselementStillingURI fim:harStillingIOrganisasjonselement ?tilknyttetOrgenhet .
  ?tilknyttetOrgenhet fim:fraOrganisasjonsrelasjon/fim:fraRolleOrganisasjonselement <http://nav.no/organisasjon/Organisasjonsenhet/1>
  }
  UNION
  { ?organisasjonselementStillingURI fim:harStillingIOrganisasjonselement ?tilknyttetOrgenhet .
  ?tilknyttetOrgenhet ((fim:fraOrganisasjonsrelasjon/fim:fraRolleOrganisasjonselement)/fim:fraOrganisasjonsrelasjon)/fim:fraRolleOrganisasjonselement <http://nav.no/organisasjon/Organisasjonsenhet/1>
  }
  UNION
  { ?organisasjonselementStillingURI fim:harStillingIOrganisasjonselement ?tilknyttetOrgenhet .
  ?tilknyttetOrgenhet ((((fim:fraOrganisasjonsrelasjon/fim:fraRolleOrganisasjonselement)/fim:fraOrganisasjonsrelasjon)/fim:fraRolleOrganisasjonselement)/fim:fraOrganisasjonsrelasjon)/fim:fraRolleOrganisasjonselement <http://nav.no/organisasjon/Organisasjonsenhet/1>
  }
  UNION
  { ?organisasjonselementStillingURI fim:harStillingIOrganisasjonselement ?tilknyttetOrgenhet .
  ?tilknyttetOrgenhet ((((((fim:fraOrganisasjonsrelasjon/fim:fraRolleOrganisasjonselement)/fim:fraOrganisasjonsrelasjon)/fim:fraRolleOrganisasjonselement)/fim:fraOrganisasjonsrelasjon)/fim:fraRolleOrganisasjonselement)/fim:fraOrganisasjonsrelasjon)/fim:fraRolleOrganisasjonselement <http://nav.no/organisasjon/Organisasjonsenhet/1>
  }
  UNION
  { ?organisasjonselementStillingURI fim:harStillingIOrganisasjonselement ?tilknyttetOrgenhet .
  ?tilknyttetOrgenhet ((((((((fim:fraOrganisasjonsrelasjon/fim:fraRolleOrganisasjonselement)/fim:fraOrganisasjonsrelasjon)/fim:fraRolleOrganisasjonselement)/fim:fraOrganisasjonsrelasjon)/fim:fraRolleOrganisasjonselement)/fim:fraOrganisasjonsrelasjon)/fim:fraRolleOrganisasjonselement)/fim:fraOrganisasjonsrelasjon)/fim:fraRolleOrganisasjonselement <http://nav.no/organisasjon/Organisasjonsenhet/1>
  }
  BIND(xsd:float(?prosent) AS ?prosentCasted)
  FILTER ( ( now() >= xsd:dateTime(?fraDato) ) && ( now()   FILTER ( ( now() >= xsd:dateTime(?allokeringFraDato) ) && ( now()   }
  }

Cause

Sign In with your My Oracle Support account

Don't have a My Oracle Support account? Click to get started

My Oracle Support provides customers with access to over a
Million Knowledge Articles and hundreds of Community platforms