Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
150 views
in Technique[技术] by (71.8m points)

rdfs - Why are some of the classes in my ontolgoy not being returned in my SPARQL query?

I'm rather confused about why I'm receiving too little results (256 expected, 224 returned). When I run the code below, everything returns exactly as I want it, except that I miss all the classes in my ontology which lie at the highest level, or one below the highest level. I don't understand where I'm being too "strict" in my query so that these classes are not being returned in the table. They also all have parent classes (whether that be the topmost class "top concept" of the ontology, or something like an enumeration type class, either way, the leaf should still be found. Would be thankful for tips or pointers where my code might be inadvertently filtering out those classes.

SELECT DISTINCT ?leaf ?parentclasses
WHERE {
GRAPH <>
#a leaf is the lowest level class: A class that does not have a subclass
{
    {
        {
            #I want anything which is a class
            {
                ?leaf rdf:type owl:Class.
            }
            #i also want the subclass of any superclass if that exists
            {
                ?leaf rdfs:subClassOf ?superclass .
            }
            #squeezed to specific section of OTL.
            filter strstarts(str(?leaf), "URIgoeshere")
            #Only keep the results that do not have a preflabel
            OPTIONAL {
                ?leaf skos:prefLabel ?subclasslabel.
                
            }
            #make sure the subclasslabel is in dutch
            #filter( langMatches(lang(?subclasslabel),"nl") )
            
            #give me the label of the superclass
            OPTIONAL {
                ?superclass skos:prefLabel ?superclasslabel.
            }
            #make sure it's in dutch
            FILTER (lang(?superclasslabel) = "nl")
            #if it exists, give me also the superclass of the superclass creating a supersuperclass
            {
                ?superclass rdfs:subClassOf ?supersuperclass.
                #give me the label of the supersuperclass
                OPTIONAL {
                    ?supersuperclass skos:prefLabel ?supersuperclasslabel.
                }
                #make sure it's in dutch
                FILTER (lang(?supersuperclasslabel) = "nl")
                #keep the leafs that are NOT The values whereby the subclass is not empty. (double negative for removing leafs where the subclass has a subclass below it)
                FILTER NOT EXISTS {
                    ?subclass rdfs:subClassOf ?leaf 
                    FILTER (?subclass != owl:Nothing ) 
                }
                #concatenate the two parentclass variables into one    
                BIND(concat(str(?superclasslabel), str("-"), str(?supersuperclasslabel) ) as ?parentclasses) 
            }
        }
    }
}

}

Here is a ttl file with the same structure as my database: https://file.io/jjwkAWbK4jrF

question from:https://stackoverflow.com/questions/65938338/why-are-some-of-the-classes-in-my-ontolgoy-not-being-returned-in-my-sparql-query

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Below is my end solution to my problem. It was more complicated than I expected, but it works.

The problem was that these classes that didn't have a parent class were not being accepted by the query. With some union cases this could be covered for 0 parent classes, 1 parent class or 2 parent classes.

SELECT DISTINCT ?leaf ?parentclasses
WHERE {
GRAPH <>
#a leaf is the lowest level class: A class that does not have a subclass
{{{{{
                    
                   
                    
        #I want anything which is a class
        {?leaf rdf:type owl:Class.}
                    
#squeezed 
        filter strstarts(str(?leaf), "graph")           
        #keep the leafs that are NOT The values whereby the subclass is not empty. 
 (double negative for removing leafs where the subclass has a subclass below it)
            FILTER NOT EXISTS {?subclass rdfs:subClassOf ?leaf 
            FILTER (?subclass != owl:Nothing ) }
 }              
                {
         {?leaf rdfs:subClassOf ?superclass .}
               
 #grab dutch label if available
optional {
?superclass skos:prefLabel ?superclassnllabel .
filter( langMatches(lang(?superclassnllabel),"nl") )
}

# take either as the label, but dutch over empty
                bind( coalesce( ?superclassnllabel, replace(str(? 
superclass),"^[^#]*#", "" ) ) as ?superclasslabel )
            
                {
                    
                {?superclass rdfs:subClassOf ?supersuperclass.}
                

        #grab dutch label if available
 
?supersuperclass skos:prefLabel ?supersuperclassnllabel .
                    filter( langMatches(lang(?supersuperclassnllabel),"nl") )



 # take either as the label, but dutch over empty
                    bind( coalesce( ?supersuperclassnllabel, replace(str(? 
 supersuperclass),"^[^#]*#", "" ) ) as ?supersuperclasslabel )
                BIND(concat(str(?superclasslabel), str(" - "), str(? 
supersuperclasslabel) ) as ?parentclasses)
                }
                union
                {
                    
                    {?superclass ?p ?o.filter(!isblank(?superclass))}
                    FILTER NOT EXISTS {?superclass rdfs:subClassOf ?supersuperclass}
                        BIND(concat(str(?superclasslabel), str(" - "), str("Top 
Concept") ) as ?parentclasses) 
                #concatenate the two parentclass variables into one    
                
                }


        
            }
            }
            
            union
            {
                   #figure this out, WHY IS IT HERE? 
                {?leaf rdf:type owl:Class .filter(!isblank(?leaf))}
                FILTER strstarts(str(?leaf), "graph") 
                FILTER NOT EXISTS {?leaf rdfs:subClassOf ?superclass}
                FILTER NOT EXISTS {?subclass rdfs:subClassOf ?leaf 
                FILTER (?subclass != owl:Nothing ) }
                BIND (str("Top Class")  as ?parentclasses )
                   
                
                }

            }}}}
            

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...