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 relacionar consultas SPARQL con registros de relaciones 1-a-muchos o cómo mover duplicados parciales?

Estoy haciendo una consulta en dbpedia que devuelve la información religiosa de un país.

Sin embargo, el problema es que la religión de un país podría obtenerse con dbo:Religion mientras que necesito otra información, que es el porcentaje de esta religión en este país. Esto solo se puede obtener con el término dbp:Religion.

El problema es que no hay conexión entre estos dos términos dbo:Religion y dbp:Religion, por lo que el resultado final devuelto es el siguiente:

País Religión PorcentajeReligión
Afganistán Demografía 99.7%
Afganistán Demografía 0.3%
Afganistán Islam 0.3%
Afganistán Islam 99.7%

mientras que mi resultado esperado debería ser:

País Religión PorcentajeReligión
Afganistán Demografía 99.7%
Afganistán Islam 0.3%

Aquí está mi consulta:

SELECT str(?Country)AS ?Country str(?Religion) AS ?Religion ?religionPercentage WHERE {
?s dbo:religion ?o .
FILTER(EXISTS {
?s a dbo:Country;
dbo:capital ?capital;
dbo:area ?area;
dbo:countryCode ?CountryCode;
dbo:populationTotal ?Population})
?s dbp:religion ?religionPercentage.
FILTER(datatype(?religionPercentage) in (xsd:double,xsd:integer) )
?s rdfs:label ?Country.
?o rdfs:label ?Religion.
FILTER(lang(?Country) = ‘en’)
FILTER(lang(?Religion) = ‘en’)
}
GROUP BY ?Country ?Religion ?religionPercentage
ORDER BY ASC(?Country)

¿Existe alguna solución para este tipo de relaciones uno a muchos?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, una solución para esta relación uno a muchos es utilizar una subconsulta para obtener la propiedad dbp:Religion por separado y luego unirla a la consulta principal utilizando la propiedad común dbo:Religion. Esto se puede lograr modificando la consulta de la siguiente manera:

    SELECT str(?Country) AS ?Country str(?Religion) AS ?Religion ?religionPercentage WHERE { 
    ?s dbo:religion ?o .
    FILTER(EXISTS {
    ?s a dbo:Country;
    dbo:capital ?capital;
    dbo:area ?area;
    dbo:countryCode ?CountryCode;
    dbo:populationTotal ?Population})
    ?s rdfs:label ?Country.
    ?o rdfs:label ?Religion.
    FILTER(lang(?Country) = 'en')
    FILTER(lang(?Religion) = 'en')
    
    # Subconsulta para obtener dbp:Religion
    {s dbp:religion ?religionPercentage}
    FILTER(datatype(?religionPercentage) in (xsd:double,xsd:integer) )
    }
    
    GROUP BY ?Country ?Religion ?religionPercentage
    ORDER BY ASC(?Country)
    

    En esta consulta modificada, la subconsulta obtiene la propiedad dbp:Religion por separado utilizando el mismo sujeto ?s. Luego, la consulta principal une los dos resultados utilizando la propiedad común dbo:Religion.

    Esto debería devolver el resultado esperado que muestra el porcentaje de cada religión para cada país.

Comments are closed.