User:Lectrician1/CheckInverses.js

From Wikidata
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
// Checks which statements have an inverse property and displays an indicator next to a statement whether an inverse statement is present for that property or not. 
// Links to the inverse statement if an inverse is present.
// license: CC0

mw.hook("wikibase.entityPage.entityLoaded").add(async function(e) {
  const query = `SELECT DISTINCT ?statement ?inverseStatement WHERE {
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
  VALUES ?item {
    wd:${e.title}  
  }
  ?property wikibase:claim ?propertyProperty.
  # wd:Q123 p:P123 wds:123
  ?item ?propertyProperty ?statement.
  
  ?property wikibase:statementProperty ?statementProperty.
  # wds:123 ps:P123 wd:1234
  ?statement ?statementProperty ?value.
  
  # has part / member of
  ?inverseProp wdt:P1696 ?property.
  
  OPTIONAL {
    ?inverse wdt:P1647* ?inverseProp.
    
    ?inverse wikibase:claim ?inversePropertyProperty. 
    ?value ?inversePropertyProperty ?inverseStatement.
  
    ?inverse wikibase:statementProperty ?inverseStatementProperty.
    ?inverseStatement ?inverseStatementProperty ?item. 
  }
}`
  let response = await $.post("https://query.wikidata.org/sparql?format=json", {
    query: query
  })

  for (result of response.results.bindings) {
    let statementURL = result.statement.value
    const parts = statementURL.split("/");

    // Get the last item of the array (i.e., the entity ID)
    const statementId = parts[parts.length - 1].replace("-", "$");

    var inverseExists = new OO.ui.IconWidget({
      icon: 'check',
      title: 'The inverse statement exists'
    })
    var noInverse = new OO.ui.IconWidget({
      icon: 'close',
      title: 'The inverse statement does not exist'
    })

    let statementIdEscaped = $.escapeSelector(statementId)

    let indicators = $(`#${statementIdEscaped}`).find('.wikibase-snakview-indicators').eq(0)

    if ('inverseStatement' in result) {
      indicators.append($(inverseExists.$element).wrap(`<a style="float: right" target="_blank" href="${result.inverseStatement.value}"></a>`).parent())
    } else {
      indicators.append($(noInverse.$element).wrap(`<span style="float: right"></span>`).parent())
    }
  }

})