Polymer database search: query the Polymer-Data-Bank for polymer data, supporting searches by DOI, polymer name, properties, etc. Returns structure, thermal,...
---
name: polymer-db
version: 1.0.0
description: "Polymer database search: query the Polymer-Data-Bank for polymer data, supporting searches by DOI, polymer name, properties, etc. Returns structure, thermal, optical, mechanical, and electrical property information. Use when users ask about polymer properties (Tg/Td/transmittance/mechanical properties), look up polymer data from specific papers, or need to filter polymers by performance criteria."
---
# Polymer Database Search (Polymer-Data-Bank)
## API Information
- **Endpoint**: `POST https://open.bohrium.com/openapi/v1/database/common_data/list`
- **Authentication**: Header `accessKey: <YOUR_ACCESS_KEY>`
- **tableAk**: `123zl00` (Polymer-Data-Bank, 280k+ records)
- **Data Source**: Bohrium Materials Database
## Request Format
```bash
curl -s -X POST 'https://open.bohrium.com/openapi/v1/database/common_data/list' \
-H 'Content-Type: application/json' \
-H 'accessKey: <YOUR_ACCESS_KEY>' \
-d '<JSON body>'
```
### Basic Request Body
```json
{
"tableAk": "123zl00",
"page": 1,
"pageSize": 50,
"filters": { ... },
"selectedFields": ["field1", "field2"],
"orderBy": [{"field": "fieldName", "order": "asc"}]
}
```
### Parameters
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `tableAk` | string | Yes | Fixed `"123zl00"` |
| `page` | int | Yes | Page number, starting from 1 |
| `pageSize` | int | Yes | Items per page, max 5000 |
| `filters` | object | No | Filter conditions (Filter structure) |
| `selectedFields` | []string | No | Only return specified fields |
| `orderBy` | []object | No | Sort by `{"field": "xxx", "order": "asc/desc"}` |
### Filter Structure
```json
{
"type": 2,
"groupOperator": "and",
"sub": [
{
"type": 1,
"field": "field_name (dataIndex)",
"operator": "eq",
"value": "value"
}
]
}
```
- `type`: `1` = Simple condition, `2` = Compound condition (with sub)
- `groupOperator`: `"and"` | `"or"`
- `operator`: `eq` / `neq` / `like` / `gt` / `gte` / `lt` / `lte` / `in` / `nin` / `between`
**Important limitation**: All property fields are **string type** (values like `"71.3 °C"`, `"[255 °C,288 °C]"`). Operators like `gt`/`lt` perform lexicographic comparison, not numeric. Numeric range filtering must be done client-side after parsing.
## Field Name Mapping
### Basic Information
| Common Name | dataIndex | Example Value |
|-------------|-----------|---------------|
| DOI | `doi` | `"10.1021/acs.macromol.9b02359"` |
| Polymer name | `polymer_name` | `"PI"`, `"PU"` |
| Polymer type | `polymer_type` | `"Polyimide"` |
| Monomer composition/structure | `components` | `"6FDA:O=C1OC...;ODA:Nc1ccc..."` |
| Feed ratio | `feed_ratio_text` | `"DABz/m-BAPS = 1/1"` |
| Ratio type | `ratio_type` | `"mole"`, `"weight"` |
### Thermal Properties
| Common Name | dataIndex | Related Fields |
|-------------|-----------|----------------|
| Tg / Glass transition temperature | `GlassTransitionTemperature(Tg)` | `test_method_GlassTransitionTemperature(Tg)`, `heating_rate_GlassTransitionTemperature(Tg)`, `atmosphere_GlassTransitionTemperature(Tg)` |
| Td / Decomposition temperature | `DecompositionTemperature(Td)` | `decomposition_criterion_DecompositionTemperature(Td)`, `atmosphere_DecompositionTemperature(Td)` |
| Tm / Melting temperature | `MeltingTemperature(Tm)` | `test_method_MeltingTemperature(Tm)` |
| Tc / Crystallization temperature | `CrystallizationTemperature(Tc)` | — |
| CTE / Coefficient of thermal expansion | `CoefficientofThermalExpansion(CTE)` | — |
| Thermal conductivity | `ThermalConductivity` | — |
### Optical Properties
| Common Name | dataIndex | Related Fields |
|-------------|-----------|----------------|
| Transmittance | `Transmittance` | `wavelength_Transmittance`, `thickness_Transmittance` |
| Refractive index | `RefractiveIndex(n)` | `wavelength_RefractiveIndex(n)` |
| Yellow index | `YellowIndex(YI)/WhitenessIndex(WI)` | — |
| Haze | `Haze` | — |
| Birefringence | `Birefringence(Δn)` | — |
| Cut-off wavelength | `Cut-offWavelength(λ_cut)` | — |
| Abbe number | `AbbeNumber(νd)` | — |
### Mechanical Properties
| Common Name | dataIndex |
|-------------|-----------|
| Tensile strength | `TensileStrength` |
| Tensile modulus / Young's modulus | `TensileModulus` |
| Elongation at break | `ElongationatBreak` |
| Flexural strength | `FlexuralStrength` |
| Flexural modulus | `FlexuralModulus` |
| Impact strength | `ImpactStrength` |
| Shear strength | `ShearStrength` |
| Shore hardness | `ShoreHardness` |
### Electrical Properties
| Common Name | dataIndex |
|-------------|-----------|
| Dielectric constant Dk | `DielectricConstant(Dk)` |
| Dielectric loss Df | `DielectricLoss(Df/tanδ)` |
| Breakdown strength | `BreakdownStrength` |
| Volume resistivity | `VolumeResistivity` |
| Proton conductivity | `ProtonConductivity` |
### Molecular Weight
| Common Name | dataIndex |
|-------------|-----------|
| Number-average molecular weight Mn | `mn_value` |
| PDI / Polydispersity index | `pdi_value` |
## Query Strategies
### Exact Query (Q1 type)
User asks "properties of a specific DOI/polymer": query directly with `selectedFields` limiting returned fields.
```json
{
"tableAk": "123zl00",
"page": 1,
"pageSize": 50,
"filters": {
"type": 2, "groupOperator": "and",
"sub": [{"type": 1, "field": "doi", "operator": "eq", "value": "10.1021/..."}]
},
"selectedFields": ["polymer_name", "polymer_type", "GlassTransitionTemperature(Tg)", "DecompositionTemperature(Td)"]
}
```
### Numeric Range Filtering (Q2 type)
User asks "polymers with Tg > 350°C":
1. **Cannot** directly use `gt` operator (field is string, lexicographic comparison is inaccurate)
2. **Correct approach**: Use `like` operator to exclude empty values (`"value": ""`), set `pageSize: 5000`, fetch data and parse numerically on client side
```python
import re
def parse_value_celsius(val_str):
"""Parse temperature string with units, convert to °C"""
if not val_str:
return None
nums = re.findall(r'[-+]?\d+\.?\d*', val_str)
if not nums:
return None
values = [float(n) for n in nums]
max_val = max(values)
if 'K' in val_str and '°C' not in val_str:
return max_val - 273.15
elif '°F' in val_str:
return (max_val - 32) * 5 / 9
return max_val
```
3. After filtering, perform statistical analysis (type distribution, frequent monomers, etc.)
### Analysis & Recommendation (Q3 type)
User asks "suggestions for synthesizing a polymer with XX properties":
1. Use `like ""` to fetch records with that property data (max 5000/page, may need pagination)
2. Parse values on client side, filter records meeting criteria
3. Analyze `polymer_type` distribution, frequent monomers in `components`
4. Provide structural design suggestions based on data patterns
## Data Format Notes
### components field format
```
monomer_name:SMILES;monomer_name:SMILES;...
```
Example: `6FDA:O=C1OC(=O)c2cc(...)ccc21;ODA:Nc1ccc(Oc2ccc(N)cc2)cc1`
### Property value format (all strings)
- Single value: `"71.3 °C"`
- Multiple values: `"[255 °C,288 °C]"`
- Descriptive: `"over 90 %"`, `"greater than 350 °C"`
- With error: `"90.8% ± 0.6%"`
### System fields (ignore)
- `_id`: MongoDB ObjectID
- `a1b2c3d4e5_is_locked`: Lock flag
- `a1b2c3d4e5_owner_id`: Data owner
- `a1b2c3d4e5_source`: Data source
- `a1b2c3d4e5_status`: Review status
- `authors`: Contributor info
- `createTime` / `updateTime`: Timestamps
## Important Notes
1. **Inconsistent units**: Same field may mix °C, K, °F — unit conversion is required
2. **String values**: All property fields are strings, numeric comparison must be done client-side
3. **Multi-value fields**: A record may have multiple values for a property (array format like `"[val1,val2]"`)
4. **pageSize limit**: Max 5000. For large datasets, use pagination (total count in `data.count`)
5. **Special characters in field names**: e.g. `GlassTransitionTemperature(Tg)` contains parentheses, use directly as JSON key
6. **like empty string**: `"operator": "like", "value": ""` matches all non-empty records
7. **When presenting results** to user, filter out system fields (`a1b2c3d4e5_*`, `authors`), show only meaningful data
don't have the plugin yet? install it then click "run inline in claude" again.