Skill: sorrymaker0624/polymer-db (version 1.0.0)

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


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)