2 votes

Comment obtenir toutes les propriétés pour seulement une catégorie spécifique dans Wikidata ?

Existe-t-il un format de données rdf/autre format qui me permette d'obtenir toutes les propriétés qui peuvent exister dans une catégorie, par exemple une personne, ce qui devrait me renvoyer des propriétés telles que le sexe, la date de naissance, etc.

Comment interroger ces informations à https://query.wikidata.org/ ?

Ce que je veux, c'est https://www.wikidata.org/wiki/Wikidata:List_of_properties/Summary_table Mais existe-t-il un meilleur format pour cela ? Je veux accéder par programme

UPDATE

Cette requête est trop lourde, elle provoque un dépassement de délai.

SELECT ?p ?attName  WHERE {
          ?q wdt:P31 wd:Q5.
          ?q ?p ?statement.
          ?realAtt wikibase:claim ?p.
          ?realAtt rdfs:label ?attName.
          FILTER(((LANG(?attName)) = "en") || ((LANG(?attName)) = ""))
    }
    GROUP BY ?p ?attName

Je dois spécifier l'entité, par exemple Barrack Obama, puis cela fonctionne, mais cela ne me donne pas toutes les propriétés possibles.

SELECT ?p ?attName  WHERE {
      BIND(wd:Q76 AS ?q)
      ?q wdt:P31 wd:Q5.
      ?q ?p ?statement.
      ?realAtt wikibase:claim ?p.
      ?realAtt rdfs:label ?attName.
      FILTER(((LANG(?attName)) = "en") || ((LANG(?attName)) = ""))
}
GROUP BY ?p ?attName

4voto

Stanislav Kralin Points 7620

1

La page à laquelle vous avez accédé est créée par un robot. Contactez le BetaBot opérateur, si vous avez besoin de savoir comment le bot fonctionne.

2

Peut-être que le bot s'appuie sur le wd:P1963 propriété :

SELECT ?property ?propertyLabel {
  VALUES (?class) {(wd:Q5)}
  ?class wdt:P1963 ?property
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }   
} ORDER BY ASC(xsd:integer(strafter(str(?property), concat(str(wd:), "P"))))

La requête ci-dessus renvoie à 49 résultats.

3

Je vous suggère de vous appuyer sur contraintes de type des pages de la propriété :

SELECT ?property ?propertyLabel {
  VALUES (?class) {(wd:Q5)}
  ?property a wikibase:Property .
  ?property p:P2302 [ ps:P2302 wd:Q21503250 ; 
                      pq:P2309 wd:Q21503252 ; 
                      pq:P2308 ?class ] .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }   
} ORDER BY ASC(xsd:integer(strafter(str(?property), concat(str(wd:), "P"))))

La requête ci-dessus renvoie à 700 résultats.

4

La première requête de votre question fonctionne bien pour des classes relativement petites, par exemple. wd:Q6256 ("pays"). Sur le point d'accès public, il n'est pas possible de faire fonctionner la requête pour les grandes classes.

Cependant, vous pouvez diviser la requête en plusieurs parties. En Python :

from wdqs import Client
from time import sleep

client = Client()
result = client.query("SELECT (count(?p) AS ?c) {?p a wikibase:Property}")

count = int(result[0]["c"])
offset = 0
limit = 50
possible = []

while offset <= count:
    props = client.query("""
        SELECT ?property  WHERE { 
            hint:Query hint:optimizer "None" .
            {
              SELECT ?property {
                  ?property a wikibase:Property .
              } ORDER BY ?property OFFSET %s LIMIT %s
            }
            ?property wikibase:directClaim ?wdt.
            FILTER EXISTS {
                ?human ?wdt [] ; wdt:P31 wd:Q5 .
                hint:Group hint:maxParallel 501 .   
            }
            hint:Query hint:filterExists "SubQueryLimitOne" .
            # SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
        } 
        """ % (offset, limit))

    for prop in props:
        possible.append(prop['property'])
    offset += limit
    print (len(possible), min(offset, count))
    sleep(0.25)

La dernière ligne de la sortie es :

2156 5154

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X