Moving SERVICE down in the joins seems to have helped quite a bit:

PREFIX  rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX  acl:  <http://www.w3.org/ns/auth/acl#>
PREFIX  lacl: <https://w3id.org/atomgraph/linkeddatahub/admin/acl/domain#>
PREFIX  foaf: <http://xmlns.com/foaf/0.1/>
PREFIX  sioc: <http://rdfs.org/sioc/ns#>

DESCRIBE ?auth
FROM <urn:x-arq:UnionGraph>
WHERE
  {   { ?auth  acl:mode  ?Mode
          { ?auth  acl:accessTo  ?this }
        UNION
          {   { ?auth  acl:accessToClass  ?Type }
            UNION
              { ?auth  acl:accessToClass  ?Class .
                ?Type (rdfs:subClassOf)* ?Class
              }
            SERVICE ?endpoint
              { { GRAPH ?g
                    { ?this  a  ?Type }
                }
              }
          }
        {   { ?auth  acl:agent  ?agent }
          UNION
            { ?auth   acl:agentGroup  ?Group .
              ?Group  foaf:member     ?agent
            }
        }
      }
    UNION
      { ?auth  acl:mode  ?Mode
          { ?auth  acl:agentClass  foaf:Agent }
        UNION
          { ?auth  acl:agentClass  ?AuthenticatedAgentClass }
          { ?auth  acl:accessTo  ?this }
        UNION
          {   { ?auth  acl:accessToClass  ?Type }
            UNION
              { ?auth  acl:accessToClass  ?Class .
                ?Type (rdfs:subClassOf)* ?Class
              }
            SERVICE ?endpoint
              { { GRAPH ?g
                    { ?this  a  ?Type }
                }
              }
          }
      }
  }

On Sat, Dec 11, 2021 at 12:39 AM Martynas Jusevičius
<marty...@atomgraph.com> wrote:
>
> Hi,
>
> I have query that federates between 2 Fuseki instances (the "remote"
> one is fuseki-end-user):
>
> PREFIX  rdfs: <http://www.w3.org/2000/01/rdf-schema#>
> PREFIX  acl:  <http://www.w3.org/ns/auth/acl#>
> PREFIX  lacl: <https://w3id.org/atomgraph/linkeddatahub/admin/acl/domain#>
> PREFIX  foaf: <http://xmlns.com/foaf/0.1/>
> PREFIX  sioc: <http://rdfs.org/sioc/ns#>
>
> DESCRIBE ?auth
> FROM <urn:x-arq:UnionGraph>
> WHERE
>   {   { ?auth  acl:mode  acl:Read
>           { ?auth  acl:accessTo
> <https://kg.opendatahub.bz.it/queries/select-ski-resorts/> }
>         UNION
>           { SERVICE <http://fuseki-end-user:3030/ds/>
>               { { GRAPH ?g
>                     { 
> <https://kg.opendatahub.bz.it/queries/select-ski-resorts/>
>                                 a  ?Type
>                     }
>                 }
>               }
>               { ?auth  acl:accessToClass  ?Type }
>             UNION
>               { ?auth  acl:accessToClass  ?Class .
>                 ?Type (rdfs:subClassOf)* ?Class
>               }
>           }
>         {   { ?auth  acl:agent  rdfs:Resource }
>           UNION
>             { ?auth   acl:agentGroup  ?Group .
>               ?Group  foaf:member     rdfs:Resource
>             }
>         }
>       }
>     UNION
>       { ?auth  acl:mode  acl:Read
>           { ?auth  acl:agentClass  foaf:Agent }
>         UNION
>           { ?auth  acl:agentClass  rdfs:Resource }
>           { ?auth  acl:accessTo
> <https://kg.opendatahub.bz.it/queries/select-ski-resorts/> }
>         UNION
>           { SERVICE <http://fuseki-end-user:3030/ds/>
>               { { GRAPH ?g
>                     { 
> <https://kg.opendatahub.bz.it/queries/select-ski-resorts/>
>                                 a  ?Type
>                     }
>                 }
>               }
>               { ?auth  acl:accessToClass  ?Type }
>             UNION
>               { ?auth  acl:accessToClass  ?Class .
>                 ?Type (rdfs:subClassOf)* ?Class
>               }
>           }
>       }
>   }
>
> What I see in the fuseki-end-user log following this query is a bunch
> (200+ in this case) identical requests with this query:
>
> SELECT  *
> WHERE
>   { GRAPH ?g
>       { <https://kg.opendatahub.bz.it/queries/select-ski-resorts/>
>                   a  ?Type
>       }
>   }
>
> I understand this is due to federation and know that Fuseki does not
> cache the results, but this strikes me as terribly inefficient.
> Each SERVICE request to fuseki-end-user takes around 10 ms but 200+ of
> them add to over 2 seconds.
>
> Is there an opportunity for optimization here? Either of the query or of Jena 
> :)
>
> Martynas
> atomgraph.com

Reply via email to