Excluir resultados de la consulta SPARQL de DBpedia basada en el prefijo URI

¿Cómo puedo excluir un grupo de conceptos cuando uso el punto final DBpedia SPARQL ? Estoy usando la siguiente consulta básica para obtener una lista de conceptos:

SELECT DISTINCT ?concept WHERE { ?xa ?concept } LIMIT 100 

Resultados SPARQL

Esto me da una lista de 100 conceptos. Quiero excluir todos los conceptos que pertenecen a la clase / grupo de YAGO (es decir, cuyos IRI comienzan con http://dbpedia.org/class/yago/ ). Puedo filtrar conceptos individuales como este:

 SELECT DISTINCT ?concept WHERE { ?xa ?concept FILTER (?concept != ) } LIMIT 100 

Resultados SPARQL

Pero lo que no puedo entender es cómo excluir todas las subclases de YAGO de mis resultados. Intenté usar un * como este pero esto no logró nada:

 FILTER (?concept != ) 

Actualizar:

Esta consulta con regex parece hacer el truco, pero es realmente, muy lento y feo. Estoy deseando una mejor alternativa.

 SELECT DISTINCT ?type WHERE { [] a ?type FILTER( regex(str(?type), "^(?!http://dbpedia.org/class/yago/).+")) } ORDER BY ASC(?type) LIMIT 10 

Puede parecer un poco incómodo, pero su comentario acerca de lanzar a una cadena y hacer algunas verificaciones basadas en cadenas probablemente esté en el camino correcto. Puede hacerlo de una manera un poco más eficiente utilizando los strstarts función SPARQL 1.1:

 SELECT DISTINCT ?concept WHERE { ?xa ?concept FILTER ( !strstarts(str(?concept), "http://dbpedia.org/class/yago/") ) } LIMIT 100 

Resultados SPARQL

La otra alternativa sería encontrar una clase YAGO de nivel superior y excluir aquellos conceptos que son rdfs:subClassOf esa clase de nivel superior. Probablemente esta sea una mejor solución a largo plazo (ya que no requiere conversión a cadenas y está basada en la estructura del gráfico). Desafortunadamente, no parece que haya una sola clase YAGO de nivel superior comparable a la owl:Thing . Acabo de descargar la jerarquía de tipo YAGO desde la página de descargas de DBpedia y ejecuté esta consulta, que pide clases sin superclases, en su contra:

 prefix rdfs:  select distinct ?root where { [] rdfs:subClassOf ?root filter not exists { ?root rdfs:subClassOf ?superRoot } } 

y obtuve estos nueve resultados:

 ---------------------------------------------------------------- | root | ================================================================ |  | |  | |  | |  | |  | |  | |  | |  | |  | ---------------------------------------------------------------- 

Dado que los conceptos de YAGO no son tan estructurados como algunos de los otros, parece que el enfoque basado en cadenas puede ser el mejor en este caso. Sin embargo, si quisiera, podría hacer una consulta no basada en cadenas como esta, que pide 100 conceptos, excluyendo aquellos que tienen uno de esos nueve resultados como una superclase:

 select distinct ?concept where { [] a ?concept . filter not exists { ?concept rdfs:subClassOf* ?super . values ?super { yago:YagoLegalActorGeo yago:WaterNymph109550125 yago:PhysicalEntity100001930 yago:Abstraction100002137 yago:YagoIdentifier yago:YagoLiteral yago:YagoPermanentlyLocatedEntity yago:Thing104424418 yago:Dryad109551040 } } } limit 100 

Resultados SPARQL

No estoy seguro de qué termina siendo más rápido. El primero requiere una conversión a cadena, y los strstarts , si se implementan de forma ingenua, deben consumir http://dbpedia.org/class/ en cada concepto antes de que algo no coincida. El segundo requiere nueve comparaciones que, si los IRI están internados, son solo verificaciones de identidad de objetos. Es una pregunta interesante para una mayor investigación.