SPARQL Examples: Difference between revisions

From info216
Line 11: Line 11:


===List distinct properties only (with limit)===
===List distinct properties only (with limit)===
<syntaxhighlight >
<syntaxhighlight lang="SPARQL">
SELECT DISTINCT ?p WHERE {
SELECT DISTINCT ?p WHERE {
     ?s ?p ?o .
     ?s ?p ?o .
Line 103: Line 103:


===Only list the most prolific authors===
===Only list the most prolific authors===
<syntaxhighlight lang="SPARQL">
<syntaxhighlight lang="SPARQL">
<syntaxhighlight lang="SPARQL">
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
Line 151: Line 150:


===Embedded Wikidata query===
===Embedded Wikidata query===
<syntaxhighlight lang="sparql">
This is a toy example only. Embedded queries like this is better suited for situations when the same URIs are used in more than one triple store and you want to combine their triples. Instead, the example searches for similar labels, which graph databases may not be optimised for. Moreover, Wikidata uses language-tagged strings whereas KG4News uses plain strings, so the labels cannot be directly compared.
<syntaxhighlight lang="SPARQL">
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>


SELECT DISTINCT ?enname ?person ?wdperson WHERE {
SELECT DISTINCT ?enname ?person ?wdperson WHERE {
     BIND("T. Berners-Lee"@en AS ?enname)
     BIND("T. Berners-Lee"@en AS ?enname) # language-tagger label


     SERVICE <https://query.wikidata.org/bigdata/namespace/wdq/sparql> {
     SERVICE <https://query.wikidata.org/bigdata/namespace/wdq/sparql> {
        # return a Wikidata identifier (URI) with this label as alternative
         SELECT ?wdperson ?enname WHERE {
         SELECT ?wdperson ?enname WHERE {
             ?wdperson skos:altLabel ?enname .
             ?wdperson skos:altLabel ?enname .
         }
         }
         LIMIT 1
         LIMIT 10  # we use limit in case the label does not match
     }
     }
              
              
     BIND(STR(?enname) AS ?name)   
     BIND(STR(?enname) AS ?name)  # the same label, but with language tag removed
    # return a KG4News identifier (URI) with this label as name
     ?person foaf:name ?name .   
     ?person foaf:name ?name .   


}
}
LIMIT 1
LIMIT 10
</syntaxhighlight>
</syntaxhighlight>


===Limit===
===Add one or more triples===
You need a Blazegraph that allows writing from now on, for example the [http://sandbox.i2s.uib.no I2S sandbox]. Remember to ''create a new namespace'' first and make sure you ''use'' it afterwards.
<syntaxhighlight lang="SPARQL">
<syntaxhighlight lang="SPARQL">
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX kg: <http://i2s.uib.no/kg4news/>
PREFIX ss: <http://semanticscholar.org/>
INSERT DATA {  # note the Turtle syntax
    kg:paper_123 rdf:type ss:Paper ;
              ss:title "Semantic Knowledge Graphs for the News: A Review"@en ;
            kg:year 2022 ;
            dct:contributor kg:auth_456, kg:auth_789 .
}
</syntaxhighlight>
</syntaxhighlight>


===Limit===
===Remove one or more triples===
<syntaxhighlight lang="SPARQL">
<syntaxhighlight lang="SPARQL">
PREFIX kg: <http://i2s.uib.no/kg4news/>
DELETE DATA
{
    kg:paper_123 kg:year 2022  .
}
</syntaxhighlight>
</syntaxhighlight>


===Limit===
===Pattern-based addition and or removal of triples===
<syntaxhighlight lang="SPARQL">
<syntaxhighlight lang="SPARQL">
</syntaxhighlight>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX kg: <http://i2s.uib.no/kg4news/>
PREFIX ss: <http://semanticscholar.org/>


===Limit===
DELETE DATA {   
<syntaxhighlight lang="SPARQL">
    ?paper dct:contributor kg:auth_456
}
INSERT DATA {   
    ?paper dct:contributor kg:auth_654
}
WHERE {  # the patterns are similar to SELECT patterns
    ?paper dct:contributor kg:auth_456
}
</syntaxhighlight>
</syntaxhighlight>

Revision as of 14:54, 31 January 2023

Lecture 3:SPARQL

The KG4News knowledge graph can be accessed here (namespace kb) (read-only). To test updates, you can run your own Blazegraph server or try the I2S sandbox.

Limit

SELECT ?p WHERE {
    ?s ?p ?o .
}
LIMIT 10

List distinct properties only (with limit)

SELECT DISTINCT ?p WHERE {
    ?s ?p ?o .
}
LIMIT 10

Limit with offset

SELECT DISTINCT ?p WHERE {
    ?s ?p ?o .
}
LIMIT 10 OFFSET 9

List rdf:types

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT DISTINCT ?t WHERE {
    ?s rdf:type ?t .
}
LIMIT 50

URI for Tim Berners-Lee

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT DISTINCT ?person WHERE {
    ?person foaf:name ?name .  
 
    FILTER(CONTAINS(?name, "Berners-Lee"))
}
LIMIT 10  # best to use limit if something goes wrong

Describe Tim Berners-Lee

DESCRIBE <http://i2s.uib.no/kg4news/author/1432678629>

DESCRIBE returns a new RDF graph, whereas SELECT returns a table of rows.

Papers that mention "Semantic Web" in the title

PREFIX ss: <http://semanticscholar.org/>

SELECT DISTINCT ?paper ?title WHERE {
    ?paper ss:title ?title .  
 
    FILTER(CONTAINS(STR(?title), "Semantic Web"))
}
LIMIT 50

Similar filter that ignores capitalisation (lower/upper case)

    FILTER(REGEX(STR(?title), "Semantic Web", "i"))

Authors sorted by name

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT DISTINCT * WHERE {
    ?author foaf:name ?name .  
}
ORDER BY ?name
LIMIT 10

Sorted by descending name

ORDER BY DESC(?name)

Count papers by author

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX ss: <http://semanticscholar.org/>

SELECT DISTINCT ?author (COUNT(?paper) AS ?count) WHERE {
    ?author rdf:type ss:Author .  
    ?paper  rdf:type ss:Paper ;
            dct:contributor ?author .
}
GROUP BY ?author
LIMIT 10

Only list the most prolific authors

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX ss: <http://semanticscholar.org/>

SELECT DISTINCT ?author (COUNT(?paper) AS ?count) WHERE {
    ?author rdf:type ss:Author .  
    ?paper  rdf:type ss:Paper ;
            dct:contributor ?author .
}
GROUP BY ?author
HAVING (?count >= 10)  # similar to a filter expression
LIMIT 10               # include limit when you test

Order by descending paper count

SELECT ... {
    ...
}
GROUP BY ?person
HAVING (?count > 10)
ORDER BY DESC(?count)
LIMIT 10

Order by descending paper count and then by author name

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX ss: <http://semanticscholar.org/>

SELECT DISTINCT ?person (SAMPLE(?name) AS ?name) (COUNT(?paper) AS ?count) WHERE {
    ?person rdf:type ss:Author ;
            foaf:name ?name .  
    ?paper  rdf:type ss:Paper ;
            ss:title ?title ;
            dct:contributor ?person .
}
GROUP BY ?person
HAVING (?count > 10)
ORDER BY DESC(?count)
LIMIT 10

Embedded Wikidata query

This is a toy example only. Embedded queries like this is better suited for situations when the same URIs are used in more than one triple store and you want to combine their triples. Instead, the example searches for similar labels, which graph databases may not be optimised for. Moreover, Wikidata uses language-tagged strings whereas KG4News uses plain strings, so the labels cannot be directly compared.

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>

SELECT DISTINCT ?enname ?person ?wdperson WHERE {
    BIND("T. Berners-Lee"@en AS ?enname)  # language-tagger label

    SERVICE <https://query.wikidata.org/bigdata/namespace/wdq/sparql> {
        # return a Wikidata identifier (URI) with this label as alternative
        SELECT ?wdperson ?enname WHERE {
             ?wdperson skos:altLabel ?enname .
        }
        LIMIT 10  # we use limit in case the label does not match
    }
            
    BIND(STR(?enname) AS ?name)  # the same label, but with language tag removed
    # return a KG4News identifier (URI) with this label as name
    ?person foaf:name ?name .  

}
LIMIT 10

Add one or more triples

You need a Blazegraph that allows writing from now on, for example the I2S sandbox. Remember to create a new namespace first and make sure you use it afterwards.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX kg: <http://i2s.uib.no/kg4news/>
PREFIX ss: <http://semanticscholar.org/>

INSERT DATA {  # note the Turtle syntax
    kg:paper_123 rdf:type ss:Paper ;
               ss:title "Semantic Knowledge Graphs for the News: A Review"@en ;
            kg:year 2022 ;
            dct:contributor kg:auth_456, kg:auth_789 . 
}

Remove one or more triples

PREFIX kg: <http://i2s.uib.no/kg4news/>

DELETE DATA
{
    kg:paper_123 kg:year 2022  .
}

Pattern-based addition and or removal of triples

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX kg: <http://i2s.uib.no/kg4news/>
PREFIX ss: <http://semanticscholar.org/>

DELETE DATA {    
    ?paper dct:contributor kg:auth_456
}
INSERT DATA {    
    ?paper dct:contributor kg:auth_654
}
WHERE {  # the patterns are similar to SELECT patterns
    ?paper dct:contributor kg:auth_456
}