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 filtrar por variable que esté en una lista de valores?

Tengo esta consulta SPARQL:

all_actors = rdf.query(
””’ SELECT DISTINCT ?actor
WHERE {
?movie pred:hasActor ?actor .
}
GROUP BY ?actor
HAVING (COUNT(?movie) >= “””’ + str(LEAST_MOVIES) + ””'” ,
initNs={‘pred’: ns_predicates})

y también tengo una serie de pandas (o una lista de Python) de películas llamada unique_movies. Tanto ‘?movie’ como la serie tienen valores de cadenas de caracteres de IDs de IMDb para películas.

Quiero filtrar los resultados en la primera consulta imponiendo que ‘?movie’ debe estar en ‘unique_movies’.

¿Cómo lo hago? ¿Necesito escribir de alguna manera todas las películas en ‘unique_movies’ en texto (hay alrededor de ~200) y realizar concatenación de cadenas? No puedo encontrar ningún ejemplo similar.

Editar:

Intenté esto:

our_movies = ‘ ‘.join(unique_movies.index)
all_actors = rdf.query(
””’ SELECT DISTINCT ?actor
WHERE {
?movie pred:hasActor ?actor .
VALUES ?movie { “””’ + our_movies + ””'” }
}
GROUP BY ?actor
HAVING (COUNT(?movie) >= “””’ + str(LEAST_MOVIES) + ””'” ,
initNs={‘pred’: ns_predicates})

donde our_movies es una cadena como “imdbid1 imdbid2 … imdbidN” pero estoy obteniendo una pyparsing.ParseException: Se esperaba {SelectQuery | ConstructQuery | DescribeQuery | AskQuery}, se encontró ”V’ (en el carácter 106), (línea: 4, col: 17)

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para filtrar los resultados en la primera consulta al exigir que ?movie esté en unique_movies, se puede utilizar la cláusula VALUES en SPARQL. La cláusula VALUES le permite especificar los valores de una variable que deben considerarse durante la evaluación.

    Se puede generar una cadena de IDs de IMDb para películas a partir de unique_movies y luego usar esa cadena en la cláusula VALUES para restringir los resultados sólo a las películas en unique_movies:

    # Generar cadena de IDs de IMDb
    our_movies = ' '.join(unique_movies.index)
    
    # Usar cláusula VALUES para restringir resultados
    all_actors = rdf.query(
        """ SELECT DISTINCT ?actor
            WHERE {
                ?movie pred:hasActor ?actor .
                VALUES ?movie { """ + our_movies + """ }
            } 
            GROUP BY ?actor 
            HAVING (COUNT(?movie) >= """ + str(LEAST_MOVIES) + """),
        initNs={'pred': ns_predicates})
    

    En su edición, el error pyparsing.ParseException: Expected {SelectQuery | ConstructQuery | DescribeQuery | AskQuery}, found 'V' indica que el analizador SPARQL espera uno de los tipos de consulta (como SelectQuery o ConstructQuery), pero encontró una variable (VALUES). Es probable que este error se deba al hecho de que la cláusula VALUES debe estar encerrada entre un par de llaves ({}), y usted sólo ha encerrado los IDs de las películas entre comillas dobles ("").

Comments are closed.