often provided externally, to allow joining of different datasets unambiguously. In addition, SPARQL provides specific graph traversal syntax for data that can be thought of as a graph. The example below demonstrates a simple query that leverages the ontology definition foaf ("friend of a friend"). Specifically, the following query returns names and emails of every person in the dataset: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name ?email WHERE { ?person a foaf:Person . ?person foaf:name ?name . ?person foaf:mbox ?email . } This query joins together all of the triples with a matching subject, where the type predicate, "a", is a person (foaf:Person), and the person has one or more names (foaf:name) and mailboxes (foaf:mbox). The author of this query chose to reference the subject using the variable name "?person" for readable clarity. Since the first element of the triple is always the subject, the author could have just as easily used any variable name, such as "?subj" or "?x". Whatever name is chosen, it must be the same on each line of the query to signify that the query engine is to join triples with the same subject. The result of the join is a set of rows – ?person, ?name, ?email. This query returns the ?name and ?email because ?person is often a complex URI rather than a human-friendly string. Note that any ?person may have multiple mailboxes, so in the returned set, a ?name row may appear multiple times, once for each mailbox. This query can be distributed to multiple SPARQL endpoints (services that accept SPARQL queries and return results), computed, and results gathered, a procedure known as federated query. Whether in a federated manner or locally, additional triple definitions in the query could allow joins to different subject types, such as automobiles, to allow simple queries, for example, to return a list of names and emails for people who drive automobiles with a high fuel efficiency. Query forms In the case of queries that read data from the database, the SPARQL language specifies four different query variations for different purposes. SELECT query Used to extract raw values from a SPARQL endpoint, the results are returned in a table format. CONSTRUCT query Used to extract information from the SPARQL endpoint and transform the results into valid RDF. ASK query Used to provide a simple True/False result for a query on a SPARQL endpoint. DESCRIBE query Used to extract an