Search code examples
sparqldbpediamovieopendata

How to get movie title, 3 artist, and 1 director on single record query sparql from dbpedia?


I've trying to get movie attribut using this query.

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
SELECT ?movie ?movieTitle ?directorName ?DistributorName ?ArtistName ?Country (CONCAT(STR(MONTH(?ReleaseDate)), 
                 "/", 
                 STR(DAY(?ReleaseDate)), 
                 "/", 
                STR(YEAR(?ReleaseDate))) as ?displayDate)
WHERE{ 

  ?movie rdf:type <http://dbpedia.org/ontology/Film> .
  ?movie foaf:name ?movieTitle .
  ?movie dbpedia2:director ?directorName .
  ?movie dbpedia2:distributor ?DistributorName .
  ?movie dbpedia2:starring ?ArtistName .
  ?movie dbpedia2:country ?Country .
  ?movie <http://dbpedia.org/ontology/releaseDate> ?ReleaseDate  .

  FILTER(!isLiteral(?movieTitle) || langMatches(lang(?movieTitle), "EN"))
  FILTER ((?ReleaseDate >= "2001-01-01"^^xsd:date) && (?ReleaseDate < "2016-01-01"^^xsd:date))

}
ORDER BY DESC(?ReleaseDate)
LIMIT 500 OFFSET 0

But, the results like this format :

movieA - directorA - distributorA - ArtistA - Indonesia - 2012/06/10
movieA - directorA - distributorA - ArtistB - Indonesia - 2012/06/10
movieA - directorA - distributorA - ArtistC - Indonesia - 2012/06/10
movieB - directorD - distributorA - ArtistA - Malaysia - 2013/06/10
movieC - directorA - distributorS - ArtistD - France - 2013/03/10

I want get data by this format :

movieA - directorA - distributorA - ArtistA,ArtistB,ArtistC - Indonesia - 2012/06/10
movieB - directorD - distributorA - ArtistA - Malaysia - 2013/06/10
movieC - directorA - distributorS - ArtistD - France - 2013/03/10

Solution

  • You can do this using GroupConcat. So you can modify your query to include (GROUP_CONCAT(?ArtistName ; separator=",") as ?artists). When I ran the query, I noticed that the same could happen for director (movies with multiple directors listed), etc. So if you want each film as a row you might need to group them as well.

    Example query.

    PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
    SELECT ?movie ?movieTitle ?directorName ?DistributorName(GROUP_CONCAT(?ArtistName ; separator=",") as ?artists) ?Country (CONCAT(STR(MONTH(?ReleaseDate)), 
                     "/", 
                     STR(DAY(?ReleaseDate)), 
                     "/", 
                    STR(YEAR(?ReleaseDate))) as ?displayDate)
    WHERE{ 
    
      ?movie rdf:type <http://dbpedia.org/ontology/Film> .
      ?movie foaf:name ?movieTitle .
      ?movie dbp:director ?directorName .
      ?movie dbp:distributor ?DistributorName .
      ?movie dbp:starring ?ArtistName .
      ?movie dbp:country ?Country .
      ?movie <http://dbpedia.org/ontology/releaseDate> ?ReleaseDate  .
    
      FILTER(!isLiteral(?movieTitle) || langMatches(lang(?movieTitle), "EN"))
      FILTER ((?ReleaseDate >= "2001-01-01"^^xsd:date) && (?ReleaseDate < "2016-01-01"^^xsd:date))
    
    }
    ORDER BY DESC(?ReleaseDate)
    LIMIT 500 OFFSET 0