es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo escribir una consulta Sparql con predicado variable?

Por favor, echa un vistazo al siguiente ejemplo:

@prefix : <#> .
@prefix rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# .

:Bob :score 78 .
:John :score 50 .

:rule1 :condition [
rdf:subject :score ;
rdf:predicate :notLessThan ;
rdf:object 60
];
:condition [
rdf:subject :score ;
rdf:predicate :notGreaterThan ;
rdf:object 80
];
:rating :passed .

:rule2 :condition [
rdf:subject :score ;
rdf:predicate :lessThan ;
rdf:object 60
];
:rating :failed .

Quiero obtener la siguiente salida mediante una consulta SPQRQL:

:Bob :rating :passed.
:John :rating :failed.

Aquí rdf:predicate es modificable por el usuario, y su valor puede ser:

lessThan, notLessThan, greaterThan, notGreaterThan

¿Cómo escribo esta declaración SPARQL basada en predicado dinámico? No tengo ninguna idea. Gracias por ayudarme.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para escribir una declaración SPARQL que tenga en cuenta un predicado dinámico, se puede usar la variable de marcador de posición “?predicate” en la cláusula WHERE, y luego vincular un valor a esa variable usando declaraciones BIND. Aquí hay una consulta de ejemplo:

    PREFIX: <#>
    PREFIX rdf: <http: www.w3.org/1999/02/22-rdf-syntax-ns#="">
    
    SELECT ?person ?rating WHERE {
      ?person: score?score.
      {
        : rule1: condition [
          rdf: subject: puntaje;
          rdf: predicado ?predicado;
          rdf: objeto 60
        ].
        BIND (: aprobado AS ?rating)
      } UNION {
        : rule1: condition [
          rdf: subject: puntaje;
          rdf: predicado ?predicado;
          rdf: objeto 80
        ].
        BIND (: aprobado AS ?rating)
      } UNION {
        : rule2: condition [
          rdf: subject: puntaje;
          rdf: predicado ?predicado;
          rdf: objeto 60
        ].
        BIND (: reprobado AS ?rating)
      }
      FILTRO (? score ?predicate 60).
    }
    

    En esta consulta, primero definimos los prefijos utilizados en los datos RDF. Luego, en la cláusula WHERE, hacemos coincidir la puntuación de la persona con la puntuación en los datos RDF. Luego tenemos tres conjuntos diferentes de condiciones, que se unen con el operador UNION.

    En cada conjunto de condiciones, vinculamos el valor de calificación a la variable de marcador de posición ?rating utilizando la declaración BIND. Usamos un valor de calificación diferente para cada conjunto de condiciones para reflejar si la persona ha aprobado o reprobado.

    Finalmente, usamos la declaración FILTER para verificar si la puntuación de la persona coincide con la condición especificada por el usuario en la variable de predicado. Esto solo devolverá los resultados donde la puntuación cumpla con la condición solicitada.

Comments are closed.