Exploring LOGD Metadata with SPARQL Queries

Level: 
TWC LOGD Portal
Contributor: 
Description: 
This tutorial shows how to use SPARQL queries to explore LOGD metadata to answer questions on the TWC LOGD Portal
The following queries can be used at http://logd.tw.rpi.edu/sparql to find and describe datasets. How up to date are the dataset descriptions?

prefix dcterms:    <http://purl.org/dc/terms/>
prefix void:       <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
prefix logd:       <http://logd.tw.rpi.edu/vocab/>
 
SELECT *
WHERE {    
  graph logd:Dataset {      
    logd:Dataset dcterms:modified ?modified .
  }  
}
How do the datasets fit into the void:subset hierarchy?

prefix conversion: <http://purl.org/twc/vocab/conversion/>
prefix void:          <http://rdfs.org/ns/void#>
 
SELECT DISTINCT ?dataset ?subdataset ?size ?dump 
WHERE { 
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {  
                 ?dataset a void:Dataset . 
      optional { ?dataset void:subset ?subdataset } 
      optional { ?subdataset conversion:num_triples ?size } 
      optional { ?subdataset void:dataDump          ?dump } 
  } 
} ORDER BY ?dataset ?subdataset 
What (unversioned) datasets are at the roots of the void:subset hierarchies?

prefix foaf:       <http://xmlns.com/foaf/0.1/>
prefix dcterms:    <http://purl.org/dc/terms/>
prefix void:       <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT DISTINCT ?source_id ?source_homepage ?dataset_id ?dataset_homepage ?dataset max(?modified) AS ?lastModified
WHERE {    
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {      
    ?dataset a conversion:Dataset;
             void:subset [ a conversion:VersionedDataset ] ;
             conversion:dataset_identifier ?dataset_id;
             dcterms:modified              ?modified ;
             dcterms:source                ?organization .
    ?organization a foaf:Agent;
                  dcterms:identifier ?source_id .
  }
  graph ?meta {
    ?meta a conversion:MetaDataset .
    optional{ ?organization foaf:homepage ?source_homepage  }
    #exceeds execution time threshold: optional{ ?dataset      foaf:homepage ?dataset_homepage }
  }  
} ORDER BY ?dataset
How many verbatim conversions are there?

prefix foaf:       <http://xmlns.com/foaf/0.1/>
prefix dcterms:    <http://purl.org/dc/terms/>
prefix void:       <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT count(?dataset)
WHERE {    
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {      
    ?dataset a conversion:LayerDataset; 
             conversion:conversion_identifier "raw" .
  }
}
How many first-level enhancements are there?

prefix foaf:       <http://xmlns.com/foaf/0.1/>
prefix dcterms:    <http://purl.org/dc/terms/>
prefix void:       <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT count(?dataset)
WHERE {    
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {      
    ?dataset a conversion:LayerDataset; 
             conversion:conversion_identifier "enhancement/1" .
  }
}
What datasets are part of the LOD cloud?

prefix void:       <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT DISTINCT ?dataset ?dump  
WHERE {    
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {  
    ?dataset a conversion:Dataset;
             void:subset [ a conversion:SameAsDataset; 
                           void:dataDump ?dump ] 
  }  
}   
All datasets and their dump files

PREFIX foaf:       <http://xmlns.com/foaf/0.1/>
PREFIX dcterms:    <http://purl.org/dc/terms/>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT DISTINCT ?dataset ?dump_file
WHERE {
  
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {
        ?dataset
             a conversion:Dataset;
             void:subset ?version .
        ?version a conversion:VersionedDataset .
 
   optional {
    ?version void:subset  ?layer .
    {
     {
      ?layer 
             void:dataDump ?dump_file ;
             dcterms:modified ?modifiedtime .
     }
     UNION
     {
      ?layer  
              void:dataDump ?dump_file ;
              dcterms:modified ?modifiedtime .
     }
    }
   }
  }
}
ORDER BY DESC(?modifiedtime)
What dataset samples are there, and which are loaded in the triple store?

prefix dcterms:    <http://purl.org/dc/terms/>
prefix void:       <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT DISTINCT ?source_id ?dataset_id ?version_id ?layer_id ?sample_uri ?dump_file ?created_date ?loaded_boolean
WHERE {
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {
    ?dataset
       a conversion:Dataset;
       conversion:source_identifier  ?source_id;
       conversion:dataset_identifier ?dataset_id;
 
       void:subset [ a conversion:VersionedDataset;
                     conversion:version_identifier ?version_id;
 
                     void:subset [ a conversion:LayerDataset;
                                   conversion:conversion_identifier ?layer_id;
                                   dcterms:created                  ?created_date;
                                   void:subset ?sample_uri ]
                   ] .
    ?sample_uri a conversion:DatasetSample;
                void:dataDump ?dump_file .
  }
  optional {
    graph ?sample_uri {
       ?sample_uri a ?loaded_boolean .
       filter(?loaded_boolean = void:Dataset)
    }
  }
} ORDER BY ?source_id ?dataset_id ?version_id ?layer_id
What datasets are from "data-gov"?

prefix void:       <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT DISTINCT ?dataset
WHERE {
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {
    ?dataset a conversion:Dataset;
    conversion:source_identifier "data-gov" .
  }
}
What Datasets are at the root of the void:subset hierarchy?

prefix void:       <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT *
WHERE {
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {
    ?dataset a conversion:Dataset;
             void:subset [ a conversion:VersionedDataset ] .
  }
}
What VoID data subsets are within data-gov's dataset 1008?

prefix conversion: <http://purl.org/twc/vocab/conversion/>
prefix void:       <http://rdfs.org/ns/void#>
 
SELECT DISTINCT ?dataset ?subdataset ?size ?dump  
WHERE {   
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {    
    ?dataset a void:Dataset ; 
             conversion:source_identifier "data-gov"; 
             conversion:dataset_identifier "1008" .
    optional { ?dataset    void:subset            ?subdataset }    
    optional { ?subdataset conversion:num_triples ?size }    
    optional { ?subdataset void:dataDump          ?dump }  
  }  
} ORDER BY ?dataset ?subdataset 
Is data.gov's dataset 8 loaded in the sparql endpoint?

prefix void:       <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
ASK
WHERE {
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {
               ?dataset a void:Dataset;
                        conversion:source_identifier  "data-gov";
                        conversion:dataset_identifier "8" .
    optional { ?dataset void:subset ?subdataset }
 
    optional { ?NOPARENT void:subset ?dataset }
    filter(!bound(?NOPARENT))
  }
  graph ?dataset {
     [] a []
  }
} 
Is the raw sample loaded?

prefix ov:         <http://open.vocab.org/terms/>
 
ask
WHERE {
  graph <http://logd.tw.rpi.edu/source/data-gov/dataset/1623/version/1st-anniversary/conversion/raw/subset/sample> {
     [] ov:csvRow ?row
  }
}
Is the first enhancement sample loaded?

prefix ov:         <http://open.vocab.org/terms/>
 
ask
WHERE {
  graph <http://logd.tw.rpi.edu/source/data-gov/dataset/1623/version/1st-anniversary/conversion/e1/subset/sample> {
     [] ov:csvRow ?row
  }
}
What predicates do the datasets use?

prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT DISTINCT ?dataset ?predicate
WHERE {
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {
    ?dataset conversion:uses_predicate ?predicate
  }
}
Datasets with wgs:lat

prefix wgs:        <http://www.w3.org/2003/01/geo/wgs84_pos#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
prefix void:       <http://rdfs.org/ns/void#>
 
SELECT DISTINCT ?g 
WHERE { 
  graph ?g { 
    ?s wgs:lat ?lat 
  } 
}
3-level vs. 4-level void:subset hierarchy (cf. single vs. multiple CSVs)

Datasets comprising only one CSV create a 3-level hierarchy, while datasets comprising more than one CSV create a 4-level hierarchy. Query for all unversioned datasets
prefix void:       <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT DISTINCT ?unversioned
WHERE {
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {
    {
      # Unversioned datasets WITH single CSV
      ?unversioned void:subset            ?versioned .
      ?versioned   void:subset            ?layer     .
      ?layer       conversion:num_triples ?triples ;
                   void:dataDump          ?dump      .
    }
    UNION
    {
      # Unversioned datasets WITH multiple CSVs
      ?unversioned     void:subset            ?versioned       .
      ?versioned       void:subset            ?layer           .
      ?layer           void:dataDump          ?dump ;
                       void:subset            ?multi_component .
      ?multi_component conversion:num_triples ?triples         .
    }
  }
} ORDER BY ?unversioned 
Same as above:

prefix void:       <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT count(DISTINCT ?unversioned)
WHERE {
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {
    { # Unversioned datasets WITH single CSV
      ?unversioned void:subset [ 
                        void:subset [ 
                             conversion:num_triples ?triples ;
                             void:dataDump          ?dump     
                        ]
                   ]
    }
    UNION
    { # Unversioned datasets WITH a multiple CSVs
      ?unversioned void:subset [
                        void:subset [ 
                             void:dataDump ?dump ;
                             void:subset [
                                  conversion:num_triples ?triples 
                             ]
                        ]
                   ]
    }
  }
} 
(see http://data-gov.tw.rpi.edu/wiki/URI_design_for_RDF_conversion_of_CSV-based_data#VoID_descriptions for a diagram illustrating the different VoID hierarchies between single- and multi-CSV datasets.) A 3-level example with explicit names

prefix void:       <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
SELECT ?p ?o
WHERE {
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {
    <http://logd.tw.rpi.edu/source/data-gov/dataset/1008>
        void:subset <http://logd.tw.rpi.edu/source/data-gov/dataset/1008/version/2010-Jul-21> .
 
    <http://logd.tw.rpi.edu/source/data-gov/dataset/1008/version/2010-Jul-21>
        void:subset <http://logd.tw.rpi.edu/source/data-gov/dataset/1008/version/2010-Jul-21/conversion/raw> .
 
    <http://logd.tw.rpi.edu/source/data-gov/dataset/1008/version/2010-Jul-21/conversion/raw> ?p ?o .
  }
}
A 4-level example with explicit names

prefix void:       <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
SELECT ?p ?o
WHERE {
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {
    <http://logd.tw.rpi.edu/source/data-gov/dataset/1033>
        void:subset <http://logd.tw.rpi.edu/source/data-gov/dataset/1033/version/1st-anniversary> .
    <http://logd.tw.rpi.edu/source/data-gov/dataset/1033/version/1st-anniversary>
        void:subset <http://logd.tw.rpi.edu/source/data-gov/dataset/1033/version/1st-anniversary/conversion/raw> .
    <http://logd.tw.rpi.edu/source/data-gov/dataset/1033/version/1st-anniversary/conversion/raw>
        void:subset <http://logd.tw.rpi.edu/source/data-gov/dataset/1033/FM_FACILITY_FILE/version/1st-anniversary/conversion/raw> .
    <http://logd.tw.rpi.edu/source/data-gov/dataset/1033/FM_FACILITY_FILE/version/1st-anniversary/conversion/raw> ?p ?o
  }
}   
All dump files and their triple counts

PREFIX void: <http://rdfs.org/ns/void#> 
PREFIX conversion: <http://purl.org/twc/vocab/conversion/> 
 
SELECT ?dataDump sum(?num_triples) AS ?triples 
WHERE { 
    graph <http://logd.tw.rpi.edu/vocab/Dataset> { 
    ?dataset void:subset [ a conversion:VersionedDataset; void:subset ?layer ] . 
    { ?layer conversion:num_triples ?num_triples; void:dataDump ?dataDump. } 
    UNION 
    { ?layer void:dataDump ?dataDump; void:subset ?multiple_table .
    ?multiple_table conversion:num_triples ?num_triples . }
    } 
}
All dump files and their triple counts of an (unversioned) Dataset

PREFIX void:       <http://rdfs.org/ns/void#>
PREFIX conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT ?dataDump sum(?num_triples) AS ?triples
WHERE {
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {
 
    <http://logd.tw.rpi.edu/source/data-gov/dataset/1008> 
      void:subset [
        a conversion:VersionedDataset;
        void:subset ?layer ] .
 
    {
      ?layer conversion:num_triples ?num_triples;
             void:dataDump          ?dataDump.
    }
    UNION
    {
      ?layer void:dataDump ?dataDump;
             void:subset   ?multiple_table .
 
      ?multiple_table conversion:num_triples ?num_triples .
    }
  }
}
Getting a dump file of a sample subset of a dataset

prefix conversion: <http://purl.org/twc/vocab/conversion/>
prefix void:       <http://rdfs.org/ns/void#>
SELECT DISTINCT ?dataset ?versionedDataset ?layerDataset ?sample ?dump
WHERE {
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {
    ?dataset          void:subset ?versionedDataset .
    ?versionedDataset a conversion:VersionedDataset;
                      void:subset ?layerDataset .
    ?layerDataset     a conversion:LayerDataset;
                      void:subset ?sample .
    ?sample           a conversion:DatasetSample;
                      void:dataDump ?dump .
  }
} ORDER BY ?dataset ?versionedDataset ?layerDataset ?sample
Getting a dump file of a sample subset of a dataset (#2)

prefix conversion: <http://purl.org/twc/vocab/conversion/>
prefix void:       <http://rdfs.org/ns/void#>
SELECT DISTINCT ?source_id ?dataset_id ?sample ?dump
WHERE {
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {
    ?sample a conversion:DatasetSample;
            conversion:source_identifier   ?source_id;
            conversion:dataset_identifier  ?dataset_id;
            conversion:version_identifier "1st-anniversary";
            void:dataDump ?dump .
  }
} ORDER BY ?sample
Attributes on Datasets with void:dataDumps

prefix dcterms:    <http://purl.org/dc/terms/>
prefix void:          <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT *
WHERE {    
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {      
    {?dataset a conversion:LayerDataset; void:dataDump ?dump }
   optional { ?dataset conversion:source_identifier ?source_id }
   optional { ?dataset conversion:dataset_identifier ?dataset_id }
   optional { ?dataset conversion:dataset_version ?version_id }
  }  
}
Counts of datasets with different sets of attributes

prefix dcterms:    <http://purl.org/dc/terms/>
prefix void:          <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT count(DISTINCT ?dataset1) AS ?dumps 
           count(DISTINCT ?dataset2) AS ?to_source 
           count(DISTINCT ?dataset3) AS ?to_dataset 
           count(DISTINCT ?dataset4) AS ?to_version
WHERE {    
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {      
    {?dataset1 void:dataDump ?dumpfile}
    UNION
 
    {?dataset2 void:dataDump ?dumpfile; conversion:source_identifier ?source_id}
    UNION
           
     {?dataset3 void:dataDump ?dumpfile; conversion:source_identifier ?source_id; conversion:dataset_identifier ?dataset_id}
   UNION
 
    {?dataset4 void:dataDump ?dumpfile; conversion:source_identifier ?source_id; conversion:dataset_identifier ?dataset_id; conversion:dataset_version ?version_id}
  }  
}
Datasets (intentionally) without a version

prefix dcterms:    <http://purl.org/dc/terms/>
prefix void:          <http://rdfs.org/ns/void#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT DISTINCT ?dataset3
WHERE {    
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {      
     ?dataset3 void:dataDump ?dumpfile; conversion:source_identifier ?source_id; conversion:dataset_identifier ?dataset_id .
    optional{?dataset3 conversion:dataset_version ?version_id}
    filter(!bound(?version_id))
  }  
} ORDER BY ?dataset3
What types are instances of void:Dataset?

prefix conversion: <http://purl.org/twc/vocab/conversion/>
prefix void:          <http://rdfs.org/ns/void#>
 
SELECT DISTINCT ?type
WHERE {
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {  
     ?dataset a void:Dataset ; a ?type .
  }
} ORDER BY ?type
How many triples?

prefix conversion: <http://purl.org/twc/vocab/conversion/>
prefix void:           <http://rdfs.org/ns/void#>
    
SELECT ?dataset ?size  
WHERE {    
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {      
    ?dataset conversion:num_triples ?size    
  }
} ORDER BY ?dataset
What prefixes does a dataset use?

prefix void:       <http://rdfs.org/ns/void#>
prefix vann:       <http://purl.org/vocab/vann/>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT DISTINCT ?prefix ?namespace
WHERE {
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {
    <http://logd.tw.rpi.edu/source/data-gov/dataset/1008>
       a conversion:Dataset;
       conversion:source_identifier  ?source_id;
       conversion:dataset_identifier ?dataset_id;
 
       void:subset [ a conversion:VersionedDataset; 
                     conversion:version_identifier ?version_id;
 
                     void:subset [ a conversion:LayerDataset;
                                   conversion:conversion_identifier ?layer_id;
                                   void:subset ?sample_uri ] 
                   ] .
    ?sample_uri a conversion:DatasetSample;
                void:dataDump ?dump_file .
  }
  graph ?sample_uri {
    [] vann:preferredNamespacePrefix ?prefix;
       vann:preferredNamespaceUri    ?namespace .
  }
} ORDER BY ?prefix ?namespace
void:exampleResources in a Versioned Dataset

prefix rdfs:       <http://www.w3.org/2000/01/rdf-schema#>
prefix void:       <http://rdfs.org/ns/void#>
prefix ov:         <http://open.vocab.org/terms/>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT DISTINCT ?eg ?col ?p ?pLabel ?o
WHERE { 
  graph <http://logd.tw.rpi.edu/source/data-gov/dataset/1033/version/2010-Aug-30> { 
    [] void:exampleResource ?eg .
    ?eg ?p ?o .
    optional{ ?p ov:csvCol                       ?col }
    optional{ ?p rdfs:label                      ?pLabel }
    optional{ ?p conversion:subjectDiscriminator ?discrim }
  } 
} ORDER BY ?eg ?col
How many outlinks to Geonames [GovTrack, DBPedia]?

prefix owl: <http://www.w3.org/2002/07/owl#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
prefix void:       <http://rdfs.org/ns/void#>
 
SELECT DISTINCT ?s ?o
WHERE {
  graph <http://purl.org/twc/vocab/conversion/SameAsDataset> {
    ?s owl:sameAs ?o
  }
  filter(regex(str(?o),"^http://sws.geonames.org*"))
}
GovTrack?

prefix owl: <http://www.w3.org/2002/07/owl#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
prefix void:       <http://rdfs.org/ns/void#>
 
SELECT DISTINCT ?s ?o
WHERE {
  graph <http://purl.org/twc/vocab/conversion/SameAsDataset> {
    ?s owl:sameAs ?o
  }
  filter(regex(str(?o),"^http://www.rdfabout.com/rdf/usgov*"))
}
DBPedia?

prefix owl: <http://www.w3.org/2002/07/owl#>
prefix conversion: <http://purl.org/twc/vocab/conversion/>
prefix void:       <http://rdfs.org/ns/void#>
 
SELECT DISTINCT ?s ?o
WHERE {
  graph <http://purl.org/twc/vocab/conversion/SameAsDataset> {
    ?s owl:sameAs ?o
  }
  filter(regex(str(?o),"^http://dbpedia.org/resource*"))
}
What enhanced predicates correspond to their raw counterparts?

This query satisfies a use case from our August data.gov mashathon in DC, where EPA converted a CSV without any header information and didn't have time to add them in. The conversion created predicates named after their first value (e.g., raw:p_20090301 instead of e1:utc_date). Reviewing the query a month later, it was VERY difficult to follow -- just as difficult as when we were doing it! After naming the predicates in the enhancement 1 conversion parameters, we were ready to replace the old query. Finding the correspondences would have been difficult and error prone if we didn't have the results from the following query. This is possible because csv2rdf4lod asserts the conversion:enhances descriptions during all enhanced conversions. Because of this, the GRAPH name can be changed to any dataset for which you want to trace predicate creation lineage.
PREFIX conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT DISTINCT ?enhanced_predicate ?raw_predicate
WHERE {
  GRAPH <http://logd.tw.rpi.edu/source/epa-gov/dataset/air-quality-system/version/mashathon> {
    ?dataset conversion:uses_predicate ?enhanced_predicate .
    ?enhanced_predicate conversion:enhances ?raw_predicate .
  }
}
Datasets enhanced with xsd:dates < h2>
PREFIX conversion: <http://purl.org/twc/vocab/conversion/>
 
SELECT *
WHERE {
  GRAPH <http://purl.org/twc/vocab/conversion/ConversionProcess> {
    [] 
       conversion:source_identifier  ?source_id;
       conversion:dataset_identifier ?dataset_id;
       conversion:dataset_version    ?version_id;
       conversion:conversion_process [
         conversion:enhancement_identifier ?enhancement_id ;
         conversion:enhance [
           conversion:date_pattern ?pattern
         ]
      ]
    .
  }
  graph <http://logd.tw.rpi.edu/vocab/Dataset> {
    ?dataset
       a conversion:LayerDataset;
       conversion:source_identifier  ?source_id;
       conversion:dataset_identifier ?dataset_id;
       conversion:version_identifier ?version_id
  }
} 
No votes yet