def subsequent_statements(self, pid): """ returns all the statements that need to be made after the property is created """ statements = defaultdict(list) # Subject item if self.subject_item: obj = Datamodel.makeWikidataItemIdValue(self.subject_item) statements[obj].append(mks(obj, 'P1687', pid)) # See also for see_also_pid in self.see_also or []: obj = Datamodel.makeWikidataPropertyIdValue(see_also_pid) statements[obj].append(mks(obj, 'P1659', pid)) # Examples for subject, target, ref in self.examples or []: statements[pid].append( mks_item(pid, 'P1855', subject, [snak(pid.getId(), target)])) subject_qid = Datamodel.makeWikidataItemIdValue(subject) statements[subject_qid].append( mks(subject_qid, pid.getId(), target, reference=ref)) for subject, statements in statements.items(): editor.updateStatements( subject, statements, [], 'create property [[Property:' + pid.getId() + ']]')
def mks(subject, prop_id, value, qualifiers=[], reference=None): pid = Datamodel.makeWikidataPropertyIdValue(prop_id) claim = Datamodel.makeClaim(subject, Datamodel.makeValueSnak(pid, value), qualifiers) references = list(current_references) if reference: references.append(mk_ref(reference)) return Datamodel.makeStatement(claim, current_references, StatementRank.NORMAL, "")
def buildStatement(forItem, property, value, reference): if isinstance(reference, str): if WD_QrefRE.sub(reference) == reference: refproperty = 'P248' ref = (ReferenceBuilder.newInstance().withPropertyValue( Datamodel.makeWikidataPropertyIdValue(refproperty), Datamodel.makeWikidataItemIdValue(reference)).build()) else: ref = reference if isinstance(property, str): if WD_PrefRE.sub(property) == property: prop = Datamodel.makeWikidataItemIdValue(property) else: prop = property if isinstance(value, str): if WD_QrefRE.sub(value) == value: val = Datamodel.makeWikidataItemIdValue(value) else: val = value return (StatementBuilder.forSubjectAndProperty( forItem, prop).withValue(val).withReference(ref).build())
def parse_example_target(self, target): parsed = self.parse_entity_id(target) if parsed: return Datamodel.makeWikidataItemIdValue(parsed) r = re.compile('[± ]+') if self.datatype == 'quantity' or self.datatype == 'number': # First remove any spurious spaces or commas spurious_space_comma_re = re.compile('[ ,](\d\d\d)') target = spurious_space_comma_re.sub(r'\1', target) try: parts = [p.strip() for p in r.split(target) if p.strip()] print(parts) if parts[-1].startswith('[') and parts[-1].endswith(']'): parts = parts[:-1] amount = BigDecimal(parts[0]) precision = 0 unit = "" if len(parts) > 1: unit_qid = self.parse_entity_id(parts[-1]) if unit_qid: unit = Datamodel.makeWikidataItemIdValue( unit_qid).getIri() try: precision = BigDecimal(parts[1]) except NumberFormatException: pass if precision: return Datamodel.makeQuantityValue( amount, amount.subtract(precision), amount.add(precision), unit) else: return Datamodel.makeQuantityValue(amount, unit) except NumberFormatException as e: print(e) target = target.strip() if target.startswith('<code>') and target.endswith('</code>'): target = target[len('<code>'):-len('</code>')] if target.startswith('['): wiki = mwparserfromhell.parse(target) for extlink in wiki.filter_external_links(): return Datamodel.makeStringValue(unicode( extlink.title.strip())) if target.startswith('"') and target.endswith( '"') and self.datatype == 'string': return Datamodel.makeStringValue(target[1:-1]) elif self.datatype == 'string' or self.datatype == 'external-id': return Datamodel.makeStringValue(target.strip())
def buildStatement(forItem, property, value, reference): if isinstance(reference, str): if WD_QrefRE.sub(reference)==reference: refproperty = 'P248' ref = (ReferenceBuilder.newInstance() .withPropertyValue(Datamodel.makeWikidataPropertyIdValue(refproperty), Datamodel.makeWikidataItemIdValue(reference)) .build()) else: ref = reference if isinstance(property, str): if WD_PrefRE.sub(property)==property: prop = Datamodel.makeWikidataItemIdValue(property) else: prop = property if isinstance(value, str): if WD_QrefRE.sub(value)==value: val = Datamodel.makeWikidataItemIdValue(value) else: val = value return (StatementBuilder.forSubjectAndProperty(forItem, prop) .withValue(val) .withReference(ref) .build())
if isinstance(property, str): if WD_PrefRE.sub(property)==property: prop = Datamodel.makeWikidataItemIdValue(property) else: prop = property if isinstance(value, str): if WD_QrefRE.sub(value)==value: val = Datamodel.makeWikidataItemIdValue(value) else: val = value return (StatementBuilder.forSubjectAndProperty(forItem, prop) .withValue(val) .withReference(ref) .build()) refDataItemProperty = Datamodel.makeWikidataPropertyIdValue("P248") ubosListOfSchools = Datamodel.makeWikidataItemIdValue("Q22679902") ubosReference = (ReferenceBuilder.newInstance() .withPropertyValue(refDataItemProperty, ubosListOfSchools) .build()) instanceOf = Datamodel.makeWikidataPropertyIdValue("P31") operatedByProperty = Datamodel.makeWikidataPropertyIdValue("P137") refUrlProperty = Datamodel.makeWikidataPropertyIdValue("P854") administrativeRegionProperty = Datamodel.makeWikidataPropertyIdValue("P131") coordinatesProperty = Datamodel.makeWikidataPropertyIdValue("P625") countryProperty = Datamodel.makeWikidataPropertyIdValue("P17") countryUgandaStatement = buildStatement(NEWITEM, countryProperty, Datamodel.makeWikidataItemIdValue("Q1036"), ubosReference) primarySchoolStatement = buildStatement(NEWITEM, instanceOf, Datamodel.makeWikidataItemIdValue("Q9842"), ubosReference) nurserySchoolStatement = buildStatement(NEWITEM, instanceOf, Datamodel.makeWikidataItemIdValue("Q1076052"), ubosReference) secondarySchoolStatement = buildStatement(NEWITEM, instanceOf, Datamodel.makeWikidataItemIdValue("Q159334"), ubosReference)
def snak_item(prop_id, val_id): return snak(prop_id, Datamodel.makeWikidataItemIdValue(val_id))
def snak(prop_id, val): return Datamodel.makeSnakGroup([ Datamodel.makeValueSnak(Datamodel.makeWikidataPropertyIdValue(prop_id), val) ])
def mks_prop(subject, prop_id, pid): value = Datamodel.makeWikidataPropertyIdValue(pid) return mks(subject, prop_id, value)
def mks_item(subject, prop_id, qid, qualifiers=[]): value = Datamodel.makeWikidataItemIdValue(qid) return mks(subject, prop_id, value, qualifiers)
def mks_str(subject, prop_id, s): value = Datamodel.makeStringValue(s) return mks(subject, prop_id, value)
def mk_ref(url): ref_pid = Datamodel.makeWikidataPropertyIdValue('P854') ref_url = Datamodel.makeStringValue(url) ref_snak = Datamodel.makeValueSnak(ref_pid, ref_url) return Datamodel.makeReference([Datamodel.makeSnakGroup([ref_snak])])
def initial_creation(self): global current_references self.output = "" npid = PropertyIdValue.NULL statements = [] labels = [] descriptions = [] ref_pid = Datamodel.makeWikidataPropertyIdValue('P4656') ref_url = Datamodel.makeStringValue(self.proposal_permalink()) ref_snak = Datamodel.makeValueSnak(ref_pid, ref_url) reference = Datamodel.makeReference( [Datamodel.makeSnakGroup([ref_snak])]) current_references = [reference] for lang, val in self.latest_labels.items(): if valid_lang_code(lang): labels.append(Datamodel.makeMonolingualTextValue(val, lang)) for lang, val in self.descriptions.items(): if valid_lang_code(lang): descriptions.append( Datamodel.makeMonolingualTextValue(val, lang)) # Type if self.datatype == 'external-id' and self.domain == 'Q5': statements.append( mks_item(npid, 'P31', 'Q19595382') ) # wikidata property for authority control for people elif self.datatype == 'external-id': statements.append( mks_item(npid, 'P31', 'Q19847637')) # wikidata property for an identifier else: statements.append(mks_item(npid, 'P31', 'Q18616576')) # wikidata property # Subject item if self.subject_item: statements.append(mks_item(npid, 'P1629', self.subject_item)) # Domain if self.domain and self.domain.startswith('Q'): statements.append( mks_item(npid, 'P2302', 'Q21503250', [ snak_item('P2309', 'Q21503252'), snak_item('P2308', self.domain), ])) # Source website if self.source: for url in self.source.split(', '): statements.append(mks_str(npid, 'P1896', url)) # Proposal discussion statements.append( mks_str( npid, 'P3254', 'https://www.wikidata.org/wiki/{}{}'.format( PROPERTY_PROPOSAL_PREFIX, self.page_name.replace(' ', '_')))) # Formatter URL if self.formatter_url: statements.append(mks_str(npid, 'P1630', self.formatter_url)) # Country if self.country: statements.append(mks_item(npid, 'P17', self.country)) # Mix'n'match if self.mixnmatch: statements.append(mks_str(npid, 'P2264', self.mixnmatch)) # Constraints if self.datatype == 'external-id': statements.append(mks_item(npid, 'P2302', 'Q19474404')) # single value constraint statements.append(mks_item( npid, 'P2302', 'Q21502410')) # distinct values constraint if self.allowed_values: statements.append(mks_str(npid, 'P1793', self.allowed_values)) statements.append( mks_item(npid, 'P2302', 'Q21502404', [ snak('P1793', Datamodel.makeStringValue(self.allowed_values)) ])) elif self.datatype == 'item': value_type_qid = self.parse_entity_id( self.allowed_values) if self.allowed_values else None if value_type_qid: statements.append( mks_item(npid, 'P2302', 'Q21510865', [ snak_item('P2309', 'Q21503252'), snak_item('P2308', value_type_qid) ])) elif self.datatype == 'number': statements.append(mks_item(npid, 'P2302', 'Q52848401')) # Allowed units if (self.datatype == 'quantity' or self.datatype == 'number') and self.allowed_units: print('ALLOWED UNITS') print(self.allowed_units) statements.append( mks_item( npid, 'P2302', 'Q21514353', [snak_item('P2305', unit) for unit in self.allowed_units])) # See also for see_also_pid in self.see_also or []: statements.append(mks_prop(npid, 'P1659', see_also_pid)) # Expected completeness if self.completeness: statements.append(mks_item(npid, 'P2429', self.completeness)) if self.number_of_ids: try: cleaned = BigDecimal(int(self.number_of_ids.replace(',', ''))) curdate = datetime.now() curmonth = Datamodel.makeTimeValue( curdate.year, curdate.month, 1, 0, 0, 0, 10, 0, 0, 0, "http://www.wikidata.org/entity/Q1985727") statements.append( mks(npid, 'P4876', Datamodel.makeQuantityValue(cleaned), [snak('P585', curmonth)])) except ValueError: pass statement_groups = make_statementgroups(statements) if self.datatype == 'item': self.datatype = 'wikibase-item' if self.datatype == 'number': self.datatype = 'quantity' if self.datatype == 'monolingual text' or self.datatype == 'monolingual string': self.datatype = 'monolingualtext' translated_datatype = JacksonDatatypeId.getDatatypeIriFromJsonDatatype( self.datatype) print(self.datatype) datatype_value = Datamodel.makeDatatypeIdValue(translated_datatype) propdoc = Datamodel.makePropertyDocument(PropertyIdValue.NULL, labels, descriptions, [], statement_groups, datatype_value) propdoc = editor.createPropertyDocument(propdoc, "creating property") return propdoc.getPropertyId()
def make_statementgroups(statements): dct = defaultdict(list) for statement in statements: dct[statement.getClaim().getMainSnak().getPropertyId()].append( statement) return [Datamodel.makeStatementGroup(lst) for lst in dct.values()]
ref = reference if isinstance(property, str): if WD_PrefRE.sub(property) == property: prop = Datamodel.makeWikidataItemIdValue(property) else: prop = property if isinstance(value, str): if WD_QrefRE.sub(value) == value: val = Datamodel.makeWikidataItemIdValue(value) else: val = value return (StatementBuilder.forSubjectAndProperty( forItem, prop).withValue(val).withReference(ref).build()) refDataItemProperty = Datamodel.makeWikidataPropertyIdValue("P248") ubosListOfSchools = Datamodel.makeWikidataItemIdValue("Q22679902") ubosReference = (ReferenceBuilder.newInstance().withPropertyValue( refDataItemProperty, ubosListOfSchools).build()) instanceOf = Datamodel.makeWikidataPropertyIdValue("P31") operatedByProperty = Datamodel.makeWikidataPropertyIdValue("P137") refUrlProperty = Datamodel.makeWikidataPropertyIdValue("P854") administrativeRegionProperty = Datamodel.makeWikidataPropertyIdValue("P131") coordinatesProperty = Datamodel.makeWikidataPropertyIdValue("P625") countryProperty = Datamodel.makeWikidataPropertyIdValue("P17") countryUgandaStatement = buildStatement( NEWITEM, countryProperty, Datamodel.makeWikidataItemIdValue("Q1036"), ubosReference) primarySchoolStatement = buildStatement( NEWITEM, instanceOf, Datamodel.makeWikidataItemIdValue("Q9842"),