Пример #1
0
def timespans_differ(time_quantity, time_unit_qid, b_seconds):
    differ = True
    if time_quantity is None:
        if b_seconds is None:
            differ = False
    else:
        if b_seconds is not None:
            a_seconds = time_in_seconds(time_quantity, time_unit_qid)
            diff = abs(a_seconds - b_seconds)
            if diff <= 1.0e-6 * b_seconds:
                differ = False
    return differ
Пример #2
0
    def __iter__(self):
        nuclides = defaultdict(Nuclide)
        nuclides_query = "PREFIX wdt: <http://www.wikidata.org/prop/direct/> \
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \
PREFIX wd: <http://www.wikidata.org/entity/> \
SELECT ?nuclide ?atomic_number ?neutron_number ?label WHERE {{ \
    ?nuclide wdt:P{0}/wdt:P{1}* wd:Q{2} ; \
             wdt:P{3} ?atomic_number ; \
             wdt:P{4} ?neutron_number ; \
             rdfs:label ?label . \
    FILTER(lang(?label) = 'en') \
}}".format(
            Nuclide.instance_pid,
            Nuclide.subclass_pid,
            Nuclide.isotope_qid,
            Nuclide.atomic_number_pid,
            Nuclide.neutron_number_pid,
        )
        query_result = self.get_sparql(nuclides_query)
        for nuclide_result in query_result:
            nuclide_uri = nuclide_result["nuclide"]["value"]
            atomic_number = nuclide_result["atomic_number"]["value"]
            neutron_number = nuclide_result["neutron_number"]["value"]
            label = nuclide_result["label"]["value"]
            nuclides[nuclide_uri].atomic_number = int(atomic_number)
            nuclides[nuclide_uri].neutron_number = int(neutron_number)
            nuclides[nuclide_uri].label = label
            nuclides[nuclide_uri].half_life = None
            nuclides[nuclide_uri].item_id = nuclide_uri.split("/")[-1]
            isomer_string_match = re.search("-\d+m(\d*)", label)
            if isomer_string_match:
                if isomer_string_match.group(1) == "":
                    nuclides[nuclide_uri].isomer_index = 1
                else:
                    nuclides[nuclide_uri].isomer_index = int(isomer_string_match.group(1))
            else:
                special_match = re.search(
                    "-\d+([ab])", label
                )  # this is used in at least one case where level order is unknown
                if special_match:
                    if special_match.group(1) == "b":
                        nuclides[nuclide_uri].isomer_index = 2
                    else:
                        nuclides[nuclide_uri].isomer_index = 1
                else:
                    nuclides[nuclide_uri].isomer_index = 0

        stable_query = "PREFIX wdt: <http://www.wikidata.org/prop/direct/> \
PREFIX wd: <http://www.wikidata.org/entity/> \
SELECT ?nuclide WHERE {{ \
    ?nuclide wdt:P{0}/wdt:P{1}* wd:Q{2} ; \
             wdt:P{0} wd:Q{3} . \
}}".format(
            Nuclide.instance_pid, Nuclide.subclass_pid, Nuclide.isotope_qid, Nuclide.stable_qid
        )
        query_result = self.get_sparql(stable_query)
        for nuclide_result in query_result:
            nuclide_uri = nuclide_result["nuclide"]["value"]
            if nuclide_uri in nuclides:
                nuclides[nuclide_uri].classes.append("stable")

        hl_query = "PREFIX wdt: <http://www.wikidata.org/prop/direct/> \
PREFIX wd: <http://www.wikidata.org/entity/> \
PREFIX wikibase: <http://wikiba.se/ontology#> \
PREFIX psv: <http://www.wikidata.org/prop/statement/value/> \
PREFIX p: <http://www.wikidata.org/prop/> \
SELECT ?nuclide ?half_life ?half_life_unit WHERE {{ \
    ?nuclide wdt:P{0}/wdt:P{1}* wd:Q{2} ; \
             p:P{3} ?hl_statement . \
    ?hl_statement psv:P{3} ?hl_value . \
    ?hl_value wikibase:quantityAmount ?half_life ; \
              wikibase:quantityUnit ?half_life_unit . \
}}".format(
            Nuclide.instance_pid, Nuclide.subclass_pid, Nuclide.isotope_qid, Nuclide.half_life_pid
        )

        query_result = self.get_sparql(hl_query)
        for nuclide_result in query_result:
            nuclide_uri = nuclide_result["nuclide"]["value"]
            if nuclide_result["half_life"]["value"] == "0":
                continue  # WDQS bug: values sometimes zero - skip
            if nuclide_uri in nuclides:
                if nuclides[nuclide_uri].half_life is None:
                    nuclides[nuclide_uri].half_life = time_in_seconds(
                        nuclide_result["half_life"]["value"], nuclide_result["half_life_unit"]["value"]
                    )
                # else - sparql returned more than 1 half-life value - problem?

        decay_query = "PREFIX ps: <http://www.wikidata.org/prop/statement/> \
PREFIX pq: <http://www.wikidata.org/prop/qualifier/> \
PREFIX p: <http://www.wikidata.org/prop/> \
PREFIX wdt: <http://www.wikidata.org/prop/direct/> \
PREFIX wd: <http://www.wikidata.org/entity/> \
SELECT ?nuclide ?decay_to ?decay_mode ?fraction WHERE {{ \
    ?nuclide wdt:P{0}/wdt:P{1}* wd:Q{2} ; \
             p:P{3} ?decay_statement . \
    ?decay_statement ps:P{3} ?decay_to ; \
                     pq:P{4} ?decay_mode ; \
                     pq:P{5} ?fraction . \
}}".format(
            Nuclide.instance_pid,
            Nuclide.subclass_pid,
            Nuclide.isotope_qid,
            Nuclide.decays_to_pid,
            Nuclide.decay_mode_pid,
            Nuclide.proportion_pid,
        )
        query_result = self.get_sparql(decay_query)
        for nuclide_result in query_result:
            nuclide_uri = nuclide_result["nuclide"]["value"]
            if nuclide_uri in nuclides:
                decay_mode_uri = nuclide_result["decay_mode"]["value"]
                decay_mode = int(decay_mode_uri.split("/")[-1].replace("Q", ""))
                nuclides[nuclide_uri].decay_modes.append(decay_mode)

        spin_parity_query = "PREFIX wdt: <http://www.wikidata.org/prop/direct/> \
PREFIX wd: <http://www.wikidata.org/entity/> \
SELECT ?nuclide ?spin ?parity WHERE {{ \
    ?nuclide wdt:P{0}/wdt:P{1}* wd:Q{2} ; \
             wdt:P{3} ?spin ; \
             wdt:P{4} ?parity . \
}}".format(
            Nuclide.instance_pid, Nuclide.subclass_pid, Nuclide.isotope_qid, Nuclide.spin_pid, Nuclide.parity_pid
        )

        query_result = self.get_sparql(spin_parity_query)
        for nuclide_result in query_result:
            nuclide_uri = nuclide_result["nuclide"]["value"]
            if nuclide_uri in nuclides:
                spin = nuclide_result["spin"]["value"]
                parity = nuclide_result["parity"]["value"]
                nuclides[nuclide_uri].spin = float(spin)
                nuclides[nuclide_uri].parity = int(parity)

        abundance_query = "PREFIX wdt: <http://www.wikidata.org/prop/direct/> \
PREFIX wd: <http://www.wikidata.org/entity/> \
SELECT ?nuclide ?abundance WHERE {{ \
    ?nuclide wdt:P{0}/wdt:P{1}* wd:Q{2} ; \
             wdt:P{3} ?abundance . \
}}".format(
            Nuclide.instance_pid, Nuclide.subclass_pid, Nuclide.isotope_qid, Nuclide.abundance_pid
        )

        query_result = self.get_sparql(abundance_query)
        for nuclide_result in query_result:
            nuclide_uri = nuclide_result["nuclide"]["value"]
            if nuclide_uri in nuclides:
                abundance = nuclide_result["abundance"]["value"]
                nuclides[nuclide_uri].abundance = float(abundance)

        for item_id, nuclide in nuclides.items():
            yield nuclide
Пример #3
0
    def __iter__(self):
        nuclides = defaultdict(Nuclide)
        nuclides_query = "PREFIX wdt: <http://www.wikidata.org/prop/direct/> \
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \
PREFIX wd: <http://www.wikidata.org/entity/> \
SELECT ?nuclide ?atomic_number ?neutron_number ?label WHERE {{ \
    ?nuclide wdt:P{0}/wdt:P{1}* wd:Q{2} ; \
             wdt:P{3} ?atomic_number ; \
             wdt:P{4} ?neutron_number ; \
             rdfs:label ?label . \
    FILTER(lang(?label) = 'en') \
}}".format(Nuclide.instance_pid, Nuclide.subclass_pid, Nuclide.isotope_qid,
           Nuclide.atomic_number_pid, Nuclide.neutron_number_pid)
        query_result = self.get_sparql(nuclides_query)
        for nuclide_result in query_result:
            nuclide_uri = nuclide_result['nuclide']['value']
            atomic_number = nuclide_result['atomic_number']['value']
            neutron_number = nuclide_result['neutron_number']['value']
            label = nuclide_result['label']['value']
            nuclides[nuclide_uri].atomic_number = int(atomic_number)
            nuclides[nuclide_uri].neutron_number = int(neutron_number)
            nuclides[nuclide_uri].label = label
            nuclides[nuclide_uri].half_life = None
            nuclides[nuclide_uri].item_id = nuclide_uri.split('/')[-1]
            isomer_string_match = re.search('-\d+m(\d*)', label)
            if isomer_string_match:
                if isomer_string_match.group(1) == '':
                    nuclides[nuclide_uri].isomer_index = 1
                else:
                    nuclides[nuclide_uri].isomer_index = int(
                        isomer_string_match.group(1))
            else:
                special_match = re.search(
                    '-\d+([ab])', label
                )  # this is used in at least one case where level order is unknown
                if special_match:
                    if special_match.group(1) == 'b':
                        nuclides[nuclide_uri].isomer_index = 2
                    else:
                        nuclides[nuclide_uri].isomer_index = 1
                else:
                    nuclides[nuclide_uri].isomer_index = 0

        stable_query = "PREFIX wdt: <http://www.wikidata.org/prop/direct/> \
PREFIX wd: <http://www.wikidata.org/entity/> \
SELECT ?nuclide WHERE {{ \
    ?nuclide wdt:P{0}/wdt:P{1}* wd:Q{2} ; \
             wdt:P{0} wd:Q{3} . \
}}".format(Nuclide.instance_pid, Nuclide.subclass_pid, Nuclide.isotope_qid,
           Nuclide.stable_qid)
        query_result = self.get_sparql(stable_query)
        for nuclide_result in query_result:
            nuclide_uri = nuclide_result['nuclide']['value']
            if nuclide_uri in nuclides:
                nuclides[nuclide_uri].classes.append('stable')

        hl_query = "PREFIX wdt: <http://www.wikidata.org/prop/direct/> \
PREFIX wd: <http://www.wikidata.org/entity/> \
PREFIX wikibase: <http://wikiba.se/ontology#> \
PREFIX psv: <http://www.wikidata.org/prop/statement/value/> \
PREFIX p: <http://www.wikidata.org/prop/> \
SELECT ?nuclide ?half_life ?half_life_unit WHERE {{ \
    ?nuclide wdt:P{0}/wdt:P{1}* wd:Q{2} ; \
             p:P{3} ?hl_statement . \
    ?hl_statement psv:P{3} ?hl_value . \
    ?hl_value wikibase:quantityAmount ?half_life ; \
              wikibase:quantityUnit ?half_life_unit . \
}}".format(Nuclide.instance_pid, Nuclide.subclass_pid, Nuclide.isotope_qid,
           Nuclide.half_life_pid)

        query_result = self.get_sparql(hl_query)
        for nuclide_result in query_result:
            nuclide_uri = nuclide_result['nuclide']['value']
            if nuclide_result['half_life']['value'] == '0':
                continue  # WDQS bug: values sometimes zero - skip
            if nuclide_uri in nuclides:
                if nuclides[nuclide_uri].half_life is None:
                    nuclides[nuclide_uri].half_life = time_in_seconds(
                        nuclide_result['half_life']['value'],
                        nuclide_result['half_life_unit']['value'])
                # else - sparql returned more than 1 half-life value - problem?

        decay_query = "PREFIX ps: <http://www.wikidata.org/prop/statement/> \
PREFIX pq: <http://www.wikidata.org/prop/qualifier/> \
PREFIX p: <http://www.wikidata.org/prop/> \
PREFIX wdt: <http://www.wikidata.org/prop/direct/> \
PREFIX wd: <http://www.wikidata.org/entity/> \
SELECT ?nuclide ?decay_to ?decay_mode ?fraction WHERE {{ \
    ?nuclide wdt:P{0}/wdt:P{1}* wd:Q{2} ; \
             p:P{3} ?decay_statement . \
    ?decay_statement ps:P{3} ?decay_to ; \
                     pq:P{4} ?decay_mode ; \
                     pq:P{5} ?fraction . \
}}".format(Nuclide.instance_pid, Nuclide.subclass_pid, Nuclide.isotope_qid,
           Nuclide.decays_to_pid, Nuclide.decay_mode_pid,
           Nuclide.proportion_pid)
        query_result = self.get_sparql(decay_query)
        for nuclide_result in query_result:
            nuclide_uri = nuclide_result['nuclide']['value']
            if nuclide_uri in nuclides:
                decay_mode_uri = nuclide_result['decay_mode']['value']
                decay_mode = int(
                    decay_mode_uri.split('/')[-1].replace('Q', ''))
                nuclides[nuclide_uri].decay_modes.append(decay_mode)

        spin_parity_query = "PREFIX wdt: <http://www.wikidata.org/prop/direct/> \
PREFIX wd: <http://www.wikidata.org/entity/> \
SELECT ?nuclide ?spin ?parity WHERE {{ \
    ?nuclide wdt:P{0}/wdt:P{1}* wd:Q{2} ; \
             wdt:P{3} ?spin ; \
             wdt:P{4} ?parity . \
}}".format(Nuclide.instance_pid, Nuclide.subclass_pid, Nuclide.isotope_qid,
           Nuclide.spin_pid, Nuclide.parity_pid)

        query_result = self.get_sparql(spin_parity_query)
        for nuclide_result in query_result:
            nuclide_uri = nuclide_result['nuclide']['value']
            if nuclide_uri in nuclides:
                spin = nuclide_result['spin']['value']
                parity = nuclide_result['parity']['value']
                nuclides[nuclide_uri].spin = float(spin)
                nuclides[nuclide_uri].parity = int(parity)

        abundance_query = "PREFIX wdt: <http://www.wikidata.org/prop/direct/> \
PREFIX wd: <http://www.wikidata.org/entity/> \
SELECT ?nuclide ?abundance WHERE {{ \
    ?nuclide wdt:P{0}/wdt:P{1}* wd:Q{2} ; \
             wdt:P{3} ?abundance . \
}}".format(Nuclide.instance_pid, Nuclide.subclass_pid, Nuclide.isotope_qid,
           Nuclide.abundance_pid)

        query_result = self.get_sparql(abundance_query)
        for nuclide_result in query_result:
            nuclide_uri = nuclide_result['nuclide']['value']
            if nuclide_uri in nuclides:
                abundance = nuclide_result['abundance']['value']
                nuclides[nuclide_uri].abundance = float(abundance)

        for item_id, nuclide in nuclides.items():
            yield nuclide