Ejemplo n.º 1
0
    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() + ']]')
Ejemplo n.º 2
0
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())
Ejemplo n.º 4
0
    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) 
Ejemplo n.º 7
0
def snak_item(prop_id, val_id):
    return snak(prop_id, Datamodel.makeWikidataItemIdValue(val_id))
Ejemplo n.º 8
0
def snak(prop_id, val):
    return Datamodel.makeSnakGroup([
        Datamodel.makeValueSnak(Datamodel.makeWikidataPropertyIdValue(prop_id),
                                val)
    ])
Ejemplo n.º 9
0
def mks_prop(subject, prop_id, pid):
    value = Datamodel.makeWikidataPropertyIdValue(pid)
    return mks(subject, prop_id, value)
Ejemplo n.º 10
0
def mks_item(subject, prop_id, qid, qualifiers=[]):
    value = Datamodel.makeWikidataItemIdValue(qid)
    return mks(subject, prop_id, value, qualifiers)
Ejemplo n.º 11
0
def mks_str(subject, prop_id, s):
    value = Datamodel.makeStringValue(s)
    return mks(subject, prop_id, value)
Ejemplo n.º 12
0
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])])
Ejemplo n.º 13
0
    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()
Ejemplo n.º 14
0
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"),