python-2.7 sparql owl rdflib

python 2.7 - recuperar el nombre de clase de una subclase específica en búho



python-2.7 sparql (2)

No ha mostrado sus datos, por lo que no puedo usar su consulta o datos exactos, pero según sus comentarios, parece que obtiene IRI (por ejemplo, http://www.semanticweb.org/raya/ontologies/test6#Good-behaviour ) como resultados, y solo desea la cadena Good-behaviour . Puedes usar strafter para hacer eso. Por ejemplo, si tuviera datos como este:

@prefix : <http://stackoverflow.com/questions/20830056/> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> :retrieving-the-class-name-of-a-specific-subclass-in-owl rdfs:label "retrieving the class name of a specific subclass in owl"@en .

Luego, una consulta como esta arrojará resultados que tengan IRI completos:

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> select ?question where { ?question rdfs:label ?label . }

--------------------------------------------------------------------------------------------------------- | question | ========================================================================================================= | <http://stackoverflow.com/questions/20830056/retrieving-the-class-name-of-a-specific-subclass-in-owl> | ---------------------------------------------------------------------------------------------------------

Puede usar strafter para obtener la parte de una cadena después de otra cadena. P.ej,

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> select ?q where { ?question rdfs:label ?label . bind(strafter(str(?question),"http://stackoverflow.com/questions/20830056/") as ?q) }

------------------------------------------------------------- | q | ============================================================= | "retrieving-the-class-name-of-a-specific-subclass-in-owl" | -------------------------------------------------------------

Si define el prefijo en la consulta, por ejemplo, como un so: entonces también puede usar str(so:) lugar de la forma de cadena. Si lo prefiere, también puede hacer la manipulación de cadenas en la lista de variables en lugar del patrón de gráfico. Eso se vería así:

prefix so: <http://stackoverflow.com/questions/20830056/> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> select (strafter(str(?question),str(so:)) as ?q) where { ?question rdfs:label ?label . }

------------------------------------------------------------- | q | ============================================================= | "retrieving-the-class-name-of-a-specific-subclass-in-owl" | -------------------------------------------------------------

Soy un principiante de rdflib , tengo una ontología con clases y subclases y necesito buscar una palabra específica en una subclase y, si se encuentra, devolver su nombre de clase.

Tengo el siguiente código:

import rdflib from rdflib import plugin from rdflib.graph import Graph g = Graph() g.parse("test.owl") from rdflib.namespace import Namespace plugin.register( ''sparql'', rdflib.query.Processor, ''rdfextras.sparql.processor'', ''Processor'') plugin.register( ''sparql'', rdflib.query.Result, ''rdfextras.sparql.query'', ''SPARQLQueryResult'') qres = g.query(""" PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?subject ?object WHERE { ?subject rdfs:subClassOf ?object } """) # n is asubclass name and its class name is good-behaviour which i want to be the result n="pity" for (subj,pred,obj) in qres: if n in subj: print obj else: print "not found"

Cuando qres el resultado de qres , devuelve una URL completa, y solo necesito el nombre de la subclase y la clase.

Alguien puede ayudarme con esto.


Puede usar RDFLib sin manipulación de cadenas de SPARQL y Python para obtener su respuesta. Si prefiere usar SPARQL, la respuesta de Joshua Taylor a esta pregunta sería el camino a seguir. Tampoco necesita el complemento de procesador SPARQL con versiones recientes (4+) de RDFLib; consulte la documentación "Consultar con SPARQL" .

Para obtener la respuesta que está buscando, puede usar el método RDFLIB Graph subject_objects para obtener un generador de sujetos y objetos con el predicado que le interesa, rdfs: subClassOf. Cada sujeto y objeto será un RDFLib URIRef, que también son objetos unicode de Python que pueden manipularse utilizando métodos estándar de Python . Para obtener el sufijo del IRI, llame al método de división del objeto y tome el último elemento en la lista devuelta.

Aquí está su código rediseñado para hacer lo descrito. Sin los datos, no puedo probarlos completamente, pero esto funcionó para mí cuando usé una ontología diferente.

from rdflib import Graph from rdflib.namespace import RDFS g = Graph() g.parse("test.owl") # n is a subclass name and its class name is good-behaviour # which i want to be the result n = "pity" for subj, obj in g.subject_objects(predicate=RDFS.subClassOf): if n in subj: print obj.rsplit(''#'')[-1] else: print ''not found''