Filtering based on a URI in SParQL [duplicate]

2019-07-03 21:56发布

问题:

This question already has an answer here:

  • Exclude results from DBpedia SPARQL query based on URI prefix 1 answer

You can run the query below at the Linked MDB SPARQL Explorer. The values of ?imdbID (the last variable) contains IRIs from one of three possible domains (freebase.com, rottentomatoes.com or imdb.com). I would like to know how to apply a filter such that only the rows from the imdb.com domain are retained.

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/terms/>
PREFIX movie: <http://data.linkedmdb.org/resource/movie/>

SELECT ?title ?date ?director ?imdbID 
WHERE {
 ?film foaf:page ?imdbID.  
 ?film dc:title ?title.
 ?film dc:date ?date .
 ?film movie:director ?directorURI.
 ?directorURI rdfs:label ?director .
}

回答1:

Not sure why this wasn't posted by @JoshuaTaylor as an answer but adding @JoshuaTaylor's filter to your query is what you are requesting:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/terms/>
PREFIX movie: <http://data.linkedmdb.org/resource/movie/>

SELECT ?title ?date ?director ?imdbID 
WHERE {
 ?film foaf:page ?imdbID.  
 ?film dc:title ?title.
 ?film dc:date ?date .
 ?film movie:director ?directorURI.
 ?directorURI rdfs:label ?director .
 FILTER(regex(str(?imdbID), "www.imdb.com" ) )
}

Which returns:

<?xml version="1.0"?>
<sparql
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:xs="http://www.w3.org/2001/XMLSchema#"
    xmlns="http://www.w3.org/2005/sparql-results#" >
  <head>
    <variable name="title"/>
    <variable name="date"/>
    <variable name="director"/>
    <variable name="imdbID"/>
  </head>
  <results>
    <result>
      <binding name="title">
        <literal>Buffy the Vampire Slayer</literal>
      </binding>
      <binding name="date">
        <literal>1992-07-31</literal>
      </binding>
      <binding name="director">
        <literal>Fran Rubel Kuzui (Director)</literal>
      </binding>
      <binding name="imdbID">
        <uri>http://www.imdb.com/title/tt0103893</uri>
      </binding>
    </result>
    <result>
      <binding name="title">
        <literal>Batman</literal>
      </binding>
      <binding name="date">
        <literal>1989-06-23</literal>
      </binding>
      <binding name="director">
        <literal>Tim Burton (Director)</literal>
      </binding>
      <binding name="imdbID">
        <uri>http://www.imdb.com/title/tt0096895</uri>
      </binding>
    </result>
    <result>
      <binding name="title">
        <literal>Batman</literal>
      </binding>
      <binding name="date">
        <literal>1966-07-30</literal>
      </binding>
      <binding name="director">
        <literal>Leslie H. Martinson (Director)</literal>
      </binding>
      <binding name="imdbID">
        <uri>http://www.imdb.com/title/tt0060153</uri>
      </binding>
    </result>
    <result>
      <binding name="title">
        <literal>Batman &amp; Robin</literal>
      </binding>
      <binding name="date">
        <literal>1997-06-20</literal>
      </binding>
      <binding name="director">
        <literal>Joel Schumacher (Director)</literal>
      </binding>
      <binding name="imdbID">
        <uri>http://www.imdb.com/title/tt0118688</uri>
      </binding>
    </result>
    <result>
      <binding name="title">
        <literal>Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb</literal>
      </binding>

If you want to make it case insensitive you can use the i flag like so:

FILTER(regex(str(?imdbID), "www.IMDB.com", "i" )

If you want to see some more information on filter have a look at 3.1 Restricting the Values of Strings.