Help:Pagina's selecteren

Het belangrijkste onderdeel van de semantisch zoeken-functionaliteit in Semantic MediaWiki is een eenvoudig formaat voor het beschrijven van welke pagina's weergegeven dienen te worden als zoekresultaat. Zoekopdrachten selecteren wikipagina's gebaseerd op de informatie die voor hen gespecificeerd is met behulp van Categorieën, Eigenschappen en eventueel sommige andere MediaWiki-functies zoals de naamruimte van een pagina. De volgende alinea's geven een inleiding tot de belangrijkse zoekfunctionaliteiten in SMW.

Categorieën en eigenschapswaarden
In het inleidende voorbeeld hebben we de losse voorwaarde Ligt in::Duitsland gegeven om te beschrijven in welke pagina's we geïnteresseerd zijn. De opmaaktekst is precies wat u anders zou schrijven om te stellen dat een bepaalde pagina deze eigenschap en waarde heeft. Het plaatsen in een semantische zoekopdracht zorgt ervoor dat SMW alle dergelijke pagina's teruggeeft. Dit is een vuistregel: De syntax voor het vragen naar pagina's die aan een bepaalde voorwaarde voldoen is precies dezelfde syntax als voor het expliciet stellen dat aan deze voorwaarde voldaan is.

De volgende zoekopdrachten laten zien wat dit betekent:
 * 1)  geeft alle pagina's die direct of indirect (via een sub-, subsub-, enz. categorie) in de categorie vallen.
 * 2) geboren in::Boston geeft alle pagina's die geannoteerd zijn als iets zeggend over iemand die in Boston geboren is.
 * 3) lengte::180cm geeft alle pagina's die geannoteerd zijn als iets zeggend over iemand die 1 meter 80 lang is.

Vervolgens kunnen we deze vereisten combineren:

geboren in::Boston lengte::180cm vraagt naar iedereen die een acteur is en geboren is in Boston en 1 meter 80 lang is. Met andere woorden: wanneer veel voorwaarden worden opgeschreven in één zoekopdracht, dan wordt het resultaat beperkt tot die pagina's die aan alle vereisten voldoen. Daarmee hebben we een logische AND. Overigens: zoekopdrachten kunnen regeleindes bevatten teneinde ze leesbaarder te maken. We kunnen dus net zo goed schrijven:

geboren in::Boston lengte::180cm

om hetzelfde resultaat te krijgen als hierboven. Merk op dat zoekopdrachten alleen artikelen teruggeven waarvan bekend is dat ze aan de gevraagde eigenschappen voldoen: als er geen eigenschap is voor de lengte van een acteur, dan zal die acteur niet worden geselecteerd.

Bij het specificeren van eigenschapswaarden, zal SMW normaal gesproken elke beginnende en afsluitende witruimte negeren, dus de twee voorwaarden lengte::180cm en lengte:: 180cm  betekenen hetzelfde. Datatypen zoals number kunnen extra kenmerken hebben zoals het negeren van komma's die gebruikt zouden kunnen worden om duizendtallen te scheiden. SMW zal synonieme paginanamen hetzelfde behandelen, net zoals MediaWiki in het algemeen Semantische wiki, Semantische_wiki en semantische wiki beschouwt als verwijzend naar dezelfde pagina.

Eigenschapswaarden: jokers en vergelijkingstekens
In de voorbeelden hierboven hebben we zeer concrete eigenschapsvoorwaarden gegeven, waarbij we "Boston" en "180cm" gebruikten als waarden voor eigenschappen. In veel gevallen is men niet op zoek naar slechts één bepaalde waarde, maar naar een hele reeks waarden, zoals alle acteurs die langer zijn dan 1 meter 80. Het kan zelfs zo zijn dat men op zoek is naar alle pagina's die wat voor waarde dan ook hebben voor een gegeven eigenschap. Overleden personen zouden bijvoorbeeld diegenen zijn die een waarde hebben voor de eigenschap "sterfdatum". Zulke algemene voorwaarden zijn mogelijk met behulp van vergelijkingstekens (comparators) en jokers (wildcards).


 * Jokers worden opgeschreven als "+" en staan elke waarde toe voor een gegeven voorwaarde. geboren in::+ geeft bijvoorbeeld alle pagina's terug die een waarde hebben voor de eigenschap "geboren in".

Vergelijkingstekens zijn speciale symbolen zoals &lt; of &gt;. Ze worden geplaats na :: in eigenschapsvoorwaarden. SMW ondersteunt momenteel de volgende vergelijkingstekens:


 * > en <: groter dan / kleiner of gelijk aan
 * !: ongelijk aan
 * ~: "lijkt op"-vergelijking voor tekenreeksen (standaard uitgeschakeld)

Vergelijkingstekens werken alleen voor eigenschapswaarden, maar niet voor randvoorwaarden aan categorieën. Een wiki-installatie kan het aantal beschikbare vergelijkingstekens beperken, wat de beheerder kan doen door de waarde van $smwgQComparators te veranderen zoals uitgelegd in het bestand SMW_Settings.php.

Groter dan of gelijk aan, kleiner dan of gelijk aan
Met numerieke waarden wilt u meestal de pagina's selecteren met eigenschapswaarden binnen een bepaald bereik. Bijvoorbeeld:

lengte::>6 ft lengte::<7 ft

vraagt naar alle acteurs die tussen 6 en 7 voet lang zijn. Merk op dat dit profiteert van de automatische eenhedenconversie: zelfs als de lengte van de acteur was aangegeven met lengte::195cm dan zou het herkend worden als correct antwoord (vooropgesteld dat het datatype voor lengte beide eenheden begrijpt, zie Help:custom units). Nota bene: het vergelijkingsteken betekent groter/kleiner dan of gelijk– het gelijkwaardigheidsteken = is niet nodig.

Dergelijke bereikvoorwaarden op eigenschapswaarden zijn meestal relevant wanneer waarden op een natuurlijke manier geordend kunnen worden. Het is bijvoorbeeld logisch om te vragen naar startdatum::>May 6 2006 maar het is niet echt zinvol om te zeggen: homepage URL::>http://www.ergens.tld.

Als een datatype geen natuurlijke lineaire ordening kent, past Semantic MediaWiki gewoon de lexicografische ordening toe op de genormaliseerde datawaarden zoals ze gebruikt worden in de RDF export. Derhalve kunt u groter dan en kleiner dan gebruiken om alfebetische bereiken te selecteren van een string-eigenschap. U kunt bijvoorbeeld vragen: achternaam::>Do achternaam::<G om achternamen tussen vanaf "Do" tot aan "G" te selecteren. Voor wikipagina's refereert het vergelijkingsteken naar de naam van de gegeven pagina (zonder de naamruimte-prefix).

Hier, en in alle andere toepassingen van vergelijkingstekens, kan het gebeuren dat een waarde waarnaar gezocht wordt werkelijk begint met een symbool als &lt;</tt>. In dit geval kan SMW tegengehouden worden van het interpreteren van een symbool als vergelijkingsteken als een spatie wordt ingevoegd na ::</tt>. Bijvoorbeeld eigenschap:: &lt;br> zoekt daadwerkelijk naar pagina's met de waarde "&lt;br>" voor een gegeven eigenschap.

Niet gelijk
U kunt pagina's selecteren die een eigenschapswaarde hebben die niet gelijk is aan een gegeven waarde. Netnummer::!0415 selecteert bijvoorbeeld pagina's die een netnummer hebben ongelijk aan "0415". Merk op dat dit een zoekopdracht-beschrijving is die niet zoekt naar pagina's die niet het netnummer 0415 hebben. In plaats daarvan zoekt zij naar pagina's die (ook) een netnummer hebben dat ongelijk is aan 0415. In het bijzonder kunnen pagina's die helemaal geen netnummer hebben, niet het resultaat zijn van de bovenstaande zoekopdracht.

Net zoals bij de (standaard) gelijkheidsvergelijking kan het gebruik van aangepaste eenheden leiden tot onverwachte resultaten. lengte::!6.00ft kan bijvoorbeeld nog steeds iemand selecteren wiens lengte wordt weergegeven als "6.00 voet", simpelweg omdat de exacte numerieke waarde niet precies 6 is. In zulke situaties kan het handiger zijn om te zoeken naar pagina's die een eigenschapswaarde buiten een bepaald bereik hebben, uitgedrukt door een disjunctie te nemen (zie hieronder) van voorwaarden met.

Tekstvergelijkingen: Lijkt op
Het vergelijkingsteken ~</tt> werkt alleen op eigenschappen van String. In een lijkt-op-vergelijking gebruikt men '*</tt>'-jokers als substitutie voor een willekeurige tekenreeks en '?</tt>' als substitutie voor één enkel teken. Men zou bijvoorbeeld Adres::~*Parkplein* kunnen vragen om adressen te selecteren waarin de tekenreeks "Parkplein" voorkomt, of Aanspreektitel::~M? om zowel "Mr." als "Mw." te selecteren.

Verenigen van zoekresultaten: disjuncties
Disjuncties zijn OR-voorwaarden die meerdere alternatieve voorwaarden aan zoekresultaten toestaan. SMW kent twee manieren om disjuncties op te schrijven in zoekopdrachten:


 * De operator OR</tt> wordt gebruikt om de vereniging te nemen van twee zoekopdrachten.
 * De operator ||</tt> wordt gebruikt voor disjuncties in waarden en pagina- en categorienamen.

In elk geval vereist de disjunctie dat aan tenminste één (maar misschien meer dan één) van de mogelijke alternatieven wordt voldaan (logische OR). Bijvoorbeeld de zoekopdracht

geboren in::Boston OR geboren in::New York

beschrijft alle pagina's over personen geboren in Boston of New York. Dit kan ook geschreven worden met ||</tt> zoals in |New York. In het laatste geval, beschrijft "Boston||New York" een waarde die één van de twee alternatieven kan zjin. Het schrijven van zoekopdrachten met ||</tt> is in de meeste gevallen bondiger, maar niet alle disjuncties kunnen op deze manier geschreven worden. Het volgende is een voorbeeld dat niet kan worden uitgedrukt met ||</tt>:

geboren in::Boston OR

De ||</tt>-syntax is niet alleen te gebruiken in eigenschapswaarden maar ook in categorieën, zoals in de zoekopdracht.

Losstaande pagina's beschrijven
Tot dusver hebben alle voorwaarden afgehangen van één of andere annotatie die binnen een pagina gegeven is. Er zijn echter ook voorwaarden die dienen om pagina's direct te selecteren, of pagina's te selecteren uit een bepaalde naamruimte.

Het direct opgeven van een paginatitel (met eventueel daarin een naamruimte-prefix), of een lijst van zulke paginatitels gescheiden door ||</tt>, selecteert de pagina's met die namen. Een voorbeeld is de zoekopdracht

|Frankrijk||User:John Doe

welke drie resultaten oplevert (tenminste, als de pagina's bestaan). Merk op dat het resultaat geen naamruimte-prefixes laat zien; daarvoor kijkt u naar de zwevende tip of statusbalk van de browser, of volgt u de verwijzingen om de naamruimte te weten te komen.

Men kan de resultaatset beperken gebaseerd op een attribuut door bijvoorbeeld te vragen "Wie van Bill Murray, Dan Akroyd, Harold Ramis en Ernie Hudson is langer dan 6ft?". Maar directe selectie van artikelen is het nuttigst als er meer eigenschappen van deze artikelen gevraagd worden, bijvoorbeeld om simpelweg de lengte van Bill Murray af te drukken.

Om op deze manier een categorie te selecteren, moet er een :</tt> staan vóór de categorienaam. Dit voorkomt verwarring tussen (geef alle acteurs terug) en Category:Acteur (geef de categorie "Acteur" terug).

Het beperken van resultaten tot een naamruimte
Een minder strikte manier om bepaalde pagina's te selecteren is via naamruimtes. De standaardinstelling is om pagina's in elke naamruimte terug te geven. Om pagina's in een specifieke naamruimte terug te geven, specificeert u de naamruimte met een "wildcard". Schrijf bijvoorbeeld Help:+ om ekle pagina in de "Help"-naamruimte terug te geven. Omdat de hoofdnaamruimte meestal geen prefix heeft, schrijft u + om alleen pagina's uit de hoofdnaamruimte te selecteren.

Disjuncties werken wederom met de ||</tt>-syntax als hierboven. Om bijvoorbeeld pagina's terug te geven die zich in de hoofd- danwel in de "User"-naamruimte bevinden, schrijft u |User:+. Om pagina's in de "Categorie"-naamruimte terug te geven, is weer een :</tt> nodig voorafgaand aan het naamruimte-label om verwarring tegen te gaan.

Subzoekopdrachten en eigenschapketens
Het opsommen van meerdere pagina's voor een eigenschap is omslachtig en lastig bij te houden. Om bijvoorbeeld alle acteurs geboren in een Italiaanse stad te selecteren zou men kunnen schrijven:

|Milaan||Turijn||Florence||...

Om een lijst van al deze Italiaanse steden op te stellen kan men een andere zoekopdracht uitvoeren

ligt in::Italië

en de resultaten kopiëren en plakken in de eerste zoekopdracht. Wat men zou willen doen is de steden-zoekopdracht gebruiken als een subzoekopdracht binnen de acteurszoekopdracht om het gewenste resultaat direct te verkrijgen. In plaats van een vastgestelde ljist van paginanamen voor de waarde van de eigenschap, wordt er een nieuwe zoekopdracht omringd door en ingevoegd binnen de eigenschapsvoorwaarde. In dit voorbeeld kan men dus schrijven:

geboren in:: [[ligt in::Italië ]]

Willekeurige nesting-niveaus zijn mogelijk, alhoewel het nesten beperkt zou kunnen zijn bij sommige sites om prestatieredenen. Nog een voorbeeld: om alle steden in de Europese Unie te selecteren kunt u schrijven:

ligt in:: [[lid van::Europese Unie ]]

In het voorbeeld hierboven hebben we in feite een keten van de eigenschappen "ligt in" en "lid van" geconstrueerd om dingen te vinden die liggen in iets dat een lid is van de EU. Zoekopdrachten kunnen worden afgekort voor dit veelvoorkomende geval:

ligt in.lid van::Europese Unie

Deze zoekopdracht betekent hetzelfde als hierboven, maar er zijn veel minder speciale symbolen voor nodig. In het algemeen worden ketens van eigenschappen gemaakt door alle eigenschappen op te sommen gescheiden door puntjes. In het zeldzame geval dat een eigenschap een puntje in de naam bevat kan met de zoekopdracht beginnen met een spatie om SMW ervan te weerhouden om dit puntje op een speciale manier te interpreteren.

Het gebruik van sjablonen en variabelen
Willekeurige sjablonen en variabelen kunnen in een query gebruikt worden. Een voorbeeld is een selectiecriterium dat alle toekomstige evenementen toont vanaf de huidige datum: einddatum::>2024-August-28

Een andere bijzonder nuttige variabele voor ingevoegde zoekopdrachten is  die de huidige naam met naamruimte oplevert, wat u in staat stelt om een generieke zoekopdracht te hergebruiken op vele pagina's. Voor een voorbeeld hiervan, zie Property:Population. Bezoek ingevoegde zoekopdrachten voor meer informatie.

Resultaten sorteren
Het is vaak behulpzaam om zoekresultaten te presenteren in een passende volgorde, bijvoorbeeld het presenteren van een lijst van Europese landen gesorteerd op aantal inwoners. Special:Ask heeft een eenvoudige interface om een sorteervolgorde mee te geven aan een zoekopdracht. U kunt de naam van de eigenschap waarop gesorteerd moet worden invoeren en op- of aflopend kiezen. SMW zal meestal proberen om de resultaten te sorteren op natuurlijke volgorde die de waarden van de geselecteerde eigenschap kunnen hebben: getallen worden numeriek gesorteerd, tekenreeksen worden alfabetisch gesorteerd en data worden chronologisch gesorteerd. De volgorde is daarom dezelfde als bij de vergelijkingstekens in zoekopdrachten. Als er geen specifieke sorteervolgorde wordt gevraagd dan zullen resultaten gesorteerd worden op hun paginanaam.

Het is mogelijk om meer dan één sorteervolgorde op te geven. Als meerdere resultaten gelijk blijken te zijn ten opzichte van de eerste sorteervolgorde, wordt de volgende gebruikt om ze te ordenen enzovoort. Een zoekopdracht naar acteurs kan bijvoorbeeld gesorteerd zijn op geboortejaar en de achternaam van de acteur gebruiken als tweede sorteervolgorde. Alle acteurs die in hetzelfde jaar zijn geboren zouden dan alfabetisch geordend zijn op hun achternaam in plaats van in willekeurige volgorde.

Het opgeven van een sortering bij een zoekopdracht kan het resultaat van die zoekopdracht beïnvloeden, omdat het slechts mogelijk is te sorteren op eigenschapswaarden die een pagina daadwerkelijk heeft. Vandaar, dat als een zoekopdracht gesorteerd is op een eigenschap (zeg "aantal inwoners") dan zal SMW normaal gesproken de zoekresultaten beperken tot die pagina's die tenminste één waarde hebben voor deze eigenschap (d.w.z. alleen pagina's waarbij het aantal inwoners is gespecificeerd, zullen verschijnen). Hieruit volgt dat als de zoekopdracht nog niet vereist dat de eigenschap aanwezig moet zijn in elk zoekresultaat, SMW deze voorwaarde stilzwijgend zal toevoegen. Maar SMW zal altijd proberen om de sorteereigenschap eerst te vinden binnen de gegeven zoekopdracht en het is zelfs mogelijk om de zoekresultaten te sorteren op subeigenschappen. Enkele voorbeelden die dit illustreren:


 *  aantal inwoners::+ </tt> gesorteerd op "aantal inwoners" zal de steden presenteren met hun aantal inwoners in oplopende volgorde. Het zoekresultaat is hetzelfde als zonder het sorteren.


 * <tt> </tt> gesorteerd op "aantal inwoners" zal wederom de steden met hun inwoners in oplopende volgorde tonen. Het zoekresultaat kan aangepast zijn vanwege de sorteervoorwaarde: als er steden zijn zonder een gegeven aantal inwoners, dan zullen deze niet langer in het resultaat worden getoond.


 * <tt> is gelegen in land.aantal inwoners::+ </tt> gesorteerd op "aantal inwoners" zal de steden tonen gesorteerd op het aantal inwoners van de landen waarin ze liggen. Het zoekresultaat is niet gewijzigd, maar "aantal inwoners" refereert nu aan een eigenschap die gebruikt wordt in een subzoekopdracht.

Als een eigenschap die wordt gebruikt voor sorteren meer dan één waarde voor een bepaalde pagina heeft, dan zal deze pagina nog steeds maar één keer voorkomen in de resultaatlijst. De positie die de pagina krijgt in dit geval wordt niet bepaald door SMW en kan corresponderen met elk van de eigenschapswaarden. In de voorbeelden hierboven zou dit vóórkomen wanneer er voor één stad meerdere inwonertallen gespecificeerd waren, of als één stad in meerdere landen ligt waarbij elk van hen een aantal inwoners heeft. Het is aanbevolen om zulke situaties te mijden.

Zoekresultaten die worden weergegeven in een resultaattabel kunnen ook dynamisch worden gesorteerd door te klikken op de kleine sorteerpictogrammen die in de tabelkop boven elke kolom te vinden zijn. Deze functie vereist dat JavaScript is ingeschakeld in de browser en zal slechts de weergegeven resultaten sorteren. Dus als een zoekopdracht bijvoorbeeld de twintig grootste wereldsteden heeft opgehaald op inwonertal, is het mogelijk om deze twintig steden alfabetisch of in omgekeerde volgorde van aantal inwoners te sorteren, maar de zoekopdracht zal zeker niet de twintig kleinste steden ter wereld tonen bij het omdraaien van de volgorde in de inwonertalkolom. Het dynamische sorteermechanisme probeert om dezelfde volgorde te behouden als in SMW-zoekopdrachten, en in sorteert het bijzonder getallen en data op een natuurlijke wijze. Echter, de alfabetische volgorde van de teksten en paginanamen kan licht verschillen van de alfabetische volgorde binnen de wiki, simpelweg omdat er veel internationale alfabetten zijn die op verschillende manieren kunnen worden gesorteerd afhankelijk van de taalvoorkeur.

Koppelingen maken naar semantische zoekresultaten
Koppelingen naar semantische zoekresultaten op Special:Ask kunnen worden gemaakt met behulp van de ingevoegde zoekopdrachten-functie in SMW zoals uitgelegd in de documentatie. Het is niet aanbevolen om directe koppelingen te maken, omdat ze erg lang zijn en een specifieke codering gebruiken. Ontwikkelaars die uitbreidingen creëren die verwijzen naar Special:Ask dienen ook SMW's interne functies te gebruiken voor het bouwen van koppelingen. Begrip van de details achter de codering van queries in koppelingen in SMW is daarom niet vereist voor het gebruik van SMW.

Subzoekopdrachten naar eigenschappen
Het is niet mogelijk om een subzoekopdracht te gebruiken om een lijst van eigenschappen te verkrijgen die vervolgens in een zoekopdracht gebruikt wordt. Wat echter wel kan, is een zoekopdracht gebruiken die een lijst van eigenschappen teruggeeft, en het resultaat daarvan kopiëren en plakken in een andere zoekopdracht.

Zoekopdrachten met speciale eigenschappen
SMW ondersteunt momenteel geen zoekopdrachten naar de waarden van enige ingebouwde Speciale eigenschappen zoals "Has type", "Allows value" of "Equivalent URI".