User:TweetsFactsAndQueries/Queries/gestation periods

Originally posted on Twitter.

# Average gestation period of genera, color-coded by order
#defaultView:BubbleChart
SELECT ?genus (AVG(?period) AS ?averagePeriod) (SAMPLE(?label) AS ?genusLabel) (SAMPLE(?rgb_) AS ?rgb) WHERE {
  {
    BIND("en" AS ?language)
    # find species with gestation period, normalized to seconds (SI base unit)
    ?species p:P3063/psn:P3063/wikibase:quantityAmount ?periodSeconds.
    # convert back to days
    BIND(?periodSeconds/(60*60*24) AS ?period)
    # find genus
    ?species wdt:P171* ?genus.
    ?genus wdt:P105 wd:Q34740.
    # find a good label – trivial name, else label, else “<no name>”
    OPTIONAL {
      ?genus wdt:P1843 ?trivialName.
      FILTER(LANG(?trivialName) = ?language)
    }
    OPTIONAL {
      ?genus rdfs:label ?genusLabel.
      FILTER(LANG(?genusLabel) = ?language)
    }
    BIND(COALESCE(?trivialName, ?genusLabel, "<no name>"@en) AS ?label)
    # find order
    ?genus wdt:P171* ?order.
    ?order wdt:P105 wd:Q36602.
    # choose “random but deterministic” color per order; you can play around with "-" (can be any string) to find a pleasing resulting color distribution
    BIND(UCASE(SUBSTR(SHA256(CONCAT("-", STR(?order))), 1, 6)) AS ?rgb_)
  } UNION {
    # add scale
    VALUES (?genus ?period ?label) {
      (wd:Q23387 7 "week"@en)
      (wd:Q5151 30.436875 "month"@en)
      (wd:Q1643308 91.310625 "3 months"@en)
      (wd:Q2269240 182.62125 "6 months"@en)
      (wd:Q577 365.2425 "year"@en)
    }
    BIND("CCCCCC" AS ?rgb_)
  }
}
GROUP BY ?genus
Try it!