# SPARQL Query for Syntax Highlighting Test
# This query includes a wide range of features to test a highlighter's capabilities.

# == 1. Prologue: Base URI and Prefixes
BASE          <http://example.org/book-data/>
PREFIX ex:    <http://example.org/vocab#>
PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
PREFIX rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:  <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd:   <http://www.w3.org/2001/XMLSchema#>
PREFIX dc:    <http://purl.org/dc/elements/1.1/>

# == 2. Query Form: SELECT with Expressions and Aggregates
SELECT DISTINCT
    ?authorName
    (UCASE(?title) AS ?upperCaseTitle)
    ?publicationDate
    # Aggregate functions
    (COUNT(?character) AS ?characterCount)
    (GROUP_CONCAT(DISTINCT ?genre; SEPARATOR=", ") AS ?genres)
    (AVG(?rating) AS ?averageRating)

# == 3. Dataset Clause: Defining the Query Target
FROM <http://example.org/library-main-graph>
FROM NAMED <http://example.org/library-metadata-graph>

# == 4. Query Pattern: The Core Logic
WHERE {
    # Inline data with VALUES
    VALUES ?authorType { foaf:Person ex:FictionalEntity }

    # Basic Graph Pattern with various term types
    ?author a foaf:person ;
            rdf:type ?authorType ;
            foaf:name ?authorName ;
            foaf:birthday ?birthDate . # Semicolon for predicate-object lists

    ?author foaf:smoker true .
    ?author foaf:child false .

    # Property path: one or more 'knows' relationships
    ?author foaf:knows+ ?colleague .

    # Nested blank node syntax
    ?book dc:creator [ foaf:name ?authorName ] ;
          dc:title ?title ;
          ex:rating ?rating . # Period to end the triple block.

    # OPTIONAL block for data that may not exist
    OPTIONAL {
        ?book ex:hasCharacter ?character .
        ?character foaf:name ?characterName .
    }

    # UNION to combine results from alternative patterns
    {
        ?book ex:genre "Science Fiction"@en .
    }
    UNION
    {
        ?book ex:genre "Fantasy"^^xsd:string .
    }

    # BIND to compute and assign a new variable
    BIND(YEAR(?birthDate) AS ?birthYear)

    # Subquery to pre-filter books
    {
      SELECT ?book ?publicationDate WHERE {
        ?book dc:date ?publicationDate .
        FILTER(?publicationDate > "2000-01-01T00:00:00"^^xsd:dateTime && ?publicationDate < "2010-01-01T00:00:00"^^xsd:dateTime)
      }
      LIMIT 100
    }

    # GRAPH clause to query a specific named graph
    GRAPH <http://example.org/library-metadata-graph> {
        ?book ex:reviewedBy _:reviewer . # Blank node label
    }

    # SERVICE clause for federated queries
    SERVICE <http://dbpedia.org/sparql> {
        ?colleague rdfs:label ?colleagueLabel .
        FILTER(LANG(?colleagueLabel) = "en")
    }

    # FILTER clause with a variety of functions and operators
    FILTER (
        # Logical, comparison, and arithmetic
        (?rating > 3.5 && ?birthYear < 1980) ||
        # Regular expression
        REGEX(?authorName, "^J\\.\\s?K\\.", "i") &&
        # Check for existence of a value
        BOUND(?characterName) &&
        # String and numeric functions
        (STRLEN(?title) - 5 > 10) &&
        # IN operator
        ?genre IN ("Fantasy", "Sci-Fi") &&
        # Datatype and language checks
        LANGMATCHES(LANG(?title), "en-US") &&
        DATATYPE(?rating) = xsd:decimal
    )

    FILTER NOT EXISTS {
        ?colleague schema:memberOf ?organization .
    }
}

# == 5. Solution Modifiers: Ordering, Grouping, and Slicing
GROUP BY ?authorName ?title ?publicationDate
HAVING (COUNT(?character) >= 2) # Filter on aggregate results
ORDER BY DESC(?averageRating) ASC(?authorName)
LIMIT 10
OFFSET 20

# == Other SPARQL Keywords (for syntax highlighting completeness)
# CONSTRUCT, DESCRIBE, ASK (alternative query forms)
# INSERT DATA, DELETE DATA, LOAD, CLEAR, CREATE, DROP (update operations)