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
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
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