Search code examples
sparqlwikidata

SPARQL Query: A sets of breeds cat along with the cats that belong to


I am trying to query all the cats breeds (wd:Q43577) along with the list of cats that belong to. Below, you will find my solution. The result of my solution is not relevant and contains a redundancy. Therefore, I need your help to find the best solution. (to execute this query, you have to use this link).

     SELECT ?CatsBreedsID ?CatsBreedsName ?CategoryID ?CategoryName ?CatsID ?CatsName  where {
     ?CatsBreedsID wdt:P31 wd:Q43577.
    OPTIONAL{

                ?CatsBreedsID wdt:P279 ?CategoryID.
                ?CatsID       wdt:P31  ?CategoryID.
            }
    SERVICE wikibase:label {
        bd:serviceParam wikibase:language "en".
            ?CatsBreedsID rdfs:label ?CatsBreedsName .
            ?CategoryID      rdfs:label ?CategoryName .
            ?CatsID      rdfs:label ?CatsName. 
    }    
    }

Solution

  • You should use the GROUP_CONCAT function if I understand your question correctly.

    Try a query like this:

        SELECT ?CatsBreedsID ?CatsBreedsName ?CategoryID ?CategoryName
               (GROUP_CONCAT(DISTINCT ?CatsID; SEPARATOR=', ') AS ?CatsID_List)
               (GROUP_CONCAT(DISTINCT ?CatsName; SEPARATOR=', ') AS ?CatsName_List)
    WHERE {
         ?CatsBreedsID wdt:P31 wd:Q43577.
        OPTIONAL{
    
                    ?CatsBreedsID wdt:P279 ?CategoryID.
                    ?CatsID       wdt:P31  ?CategoryID.
                }
        SERVICE wikibase:label {
            bd:serviceParam wikibase:language "en".
                ?CatsBreedsID rdfs:label ?CatsBreedsName .
                ?CategoryID      rdfs:label ?CategoryName .
                ?CatsID      rdfs:label ?CatsName. 
        }    
        } GROUP BY ?CatsBreedsID ?CatsBreedsName ?CategoryID ?CategoryName