How do I submit a query for materials that must have the elements B and one or more of these: Mn, Cr, Fe, or Co

I need help trying to submit a query with the Materials Project API for materials that have B, and atleast one of these elements: Mn, Co, Fe, Cr.

I would recommend doing four different queries which pass pairs of elements to the elements field.

For example, to get the IDs of materials that contain at least B and Mn you could do:

from mp_api import MPRester

with MPRester("your_api_key") as mpr:
    docs = mpr.materials.search(elements=["B", "Mn"], fields=["material_id"])
    mpids = [doc.material_id for doc in docs]

Okay so I tried to do what you suggested and included exclude_elements field to remove oxides, phos any materials containing , and each metal so that I am not getting duplicates in each query. However I am noticing that it’s not really working for example when I ran this:

with MPRester(MY_API_KEY) as mpr:
docsBFe = mpr.summary.search(elements=[“B”,“Fe”], exclude_elements=[“O”,“P”]
,fields=[“material_id”, “formula_pretty”, “cif”, “spacegroup_number”,
“crystal_system”])
print(docsBFe[0:2])

it found 907 documents, but from looking at the first entry in the list, it is mp-1207649 with the formula_pretty being YFe3(BO3)4 which contains O in it.

Also when I excluded Mn, Cr, Co for the Fe & B query above to avoid finding redundant elements in my other queries like this:

with MPRester(JOHAN_API_KEY) as mpr:
docsBFe = mpr.summary.search(elements=[“B”,“Fe”], exclude_elements=[“O”,“P”,“Mn”,“Cr”,“Co”]
,fields=[“material_id”, “formula_pretty”, “cif”, “spacegroup_number”,
“crystal_system”])
print(docsBFe[0:2])

I suprisingly obtained more documents (2933) which intuitively doesn’t make sense to me because I am adding more restrictions.

thanks for all the help btw, I really appreciate it.

Hi @J0chin, thanks for bringing this up. This could be a bug in how exclude_elements is working. I am investigating now…

– Jason

@J0chin, this is fixed as of mp-api v0.24.7. The client tries to multithread requests to our server, and there was an issue with how it was using exclude_elements to perform that parallelization. I have confirmed your examples work now.

– Jason

Okay ya it’s also working for me too. Thanks again!

Hi, I have a question. How would I submit the query for materials that has only for example “Pb” and “S”?

@Nadia_Mehjabin does this example in our docs help?

hi, this example gives me “Pb”, “S” and other elements which has any letter containing “p”,“b”, “s”. However, I only want to grab “Pb” and “S” or at least one of them

@Nadia_Mehjabin here’s a specific example

import os
from mp_api.client import MPRester
from emmet.core.utils import jsanitize

with MPRester("your-api-key-here") as mpr:
    docs = mpr.summary.search(
        chemsys="Pb-S", fields=["material_id", "formula_pretty", "chemsys"]
    )

sanitized_docs = [
    {k: v for k, v in doc.items() if k != "fields_not_requested"}
    for doc in jsanitize(docs)
]

The resulting sanitized_docs contains 22 results for this query:

[{'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-727323'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-1078500'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-2350391'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-1078944'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-1091375'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-1079543'},
 {'formula_pretty': 'PbS2', 'chemsys': 'Pb-S', 'material_id': 'mp-1025039'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-1078696'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-1018115'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-726184'},
 {'formula_pretty': 'PbS2', 'chemsys': 'Pb-S', 'material_id': 'mp-1206683'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-21276'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-1012435'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-1079101'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-1057015'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-1087486'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-557719'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-561320'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-1018019'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-21039'},
 {'formula_pretty': 'Pb3S', 'chemsys': 'Pb-S', 'material_id': 'mp-1186425'},
 {'formula_pretty': 'PbS', 'chemsys': 'Pb-S', 'material_id': 'mp-1009551'}]

Thanks! I ran just the code and it works. I am just having trouble to use it with the class that I have. It does not have attribute chemsys. So if I can fix that I am sure it will work out. Anyway thnx again.

Thread closed due to inactivity, please open a new thread to address related issues.