worksWellWith
Links to other ingredient categories or interventions that complement this one, producing better outcomes when used together than either alone. Enables synergy discovery through knowledge graph traversal.
Why This Property Exists
Many health and skincare solutions work best in combination. Understanding which ingredients or interventions complement each other is essential for:
- Product formulation: Creating products that address problems completely, not partially
- Consumer guidance: Helping users understand why multi-ingredient products exist
- Treatment protocols: Building effective combination approaches
- Knowledge graphs: Enabling queries like "what should I combine with humectants?"
Schema.org can describe individual ingredients and their effects, but has no vocabulary for expressing synergistic relationships between ingredient categories. The worksWellWith property creates explicit links between complementary categories.
This enables powerful graph traversal:
SELECT ?complement ?name WHERE {
hs:Humectant hs:worksWellWith ?complement .
?complement schema:name ?name .
}
Result: Occlusive, Emollient — the categories that complete what humectants start.
Domain and Range
Used On (Domain)
| Type | Context |
|---|---|
| hs:FunctionalIngredientCategory | Links this category to others that produce synergistic effects |
Expected Values (Range)
| Type | Notes |
|---|---|
| hs:FunctionalIngredientCategory | Reference to another category (via @id) or inline definition. Arrays allowed for multiple complements. |
Relationship Semantics
Symmetry
worksWellWith is a symmetric relationship. If A works well with B, then B works well with A. When defining categories, you should specify the relationship from both sides for completeness, though a graph processor could infer symmetry.
| If you declare | It implies |
|---|---|
| Humectant worksWellWith Occlusive | Occlusive worksWellWith Humectant |
Transitivity
worksWellWith is NOT transitive. If A works well with B, and B works well with C, it does NOT follow that A works well with C. Each pairing must be established independently.
Strength
This property indicates beneficial combination, not merely compatibility. The relationship means:
- "Using these together produces better outcomes than either alone"
- NOT merely "these don't conflict"
- NOT "these are interchangeable"
Degree of Benefit
The current property is binary (works well / doesn't work well). It doesn't capture degree of synergy. If you need to express that some combinations are more beneficial than others, use the description property or consider extending with a qualified relationship.
Usage Guidance
Do
- Link both directions—specify the relationship from both categories for completeness
- Use @id references—link to defined categories rather than repeating definitions
- Pair with
insufficientAlone—explain why the combination is needed - Include all meaningful complements—a category may work well with multiple others
Don't
- Link merely compatible categories—reserve for genuinely synergistic relationships
- Assume transitivity—each pairing must be independently established
- Link to contraindicated categories—if combining is harmful, that's not "works well with"
Relationship Network Example
In lip care, the three main categories form a complete network:
Humectant ←→ Emollient ←→ Occlusive
↑ ↑
└───────────────────────────┘
Each category works well with both others, creating a triangle of complementary relationships. All three together address the complete problem.
Examples
Example 1: Basic Complementary Relationship
Humectant needs occlusive to seal in moisture:
{
"@type": "FunctionalIngredientCategory",
"@id": "#FunctionalIngredientCategory/Humectant",
"name": "Humectant",
"mechanismOfAction": "Attracts and binds water molecules from environment or deeper tissue",
"insufficientAlone": "Cannot prevent evaporation of attracted moisture",
"worksWellWith": [
{"@id": "#FunctionalIngredientCategory/Occlusive"},
{"@id": "#FunctionalIngredientCategory/Emollient"}
]
}
Why this works: The insufficientAlone explains the gap; worksWellWith points to what fills it. Together they tell a complete story.
Example 2: Bidirectional Declaration
Showing both sides of the relationship:
{
"@graph": [
{
"@type": "FunctionalIngredientCategory",
"@id": "#FunctionalIngredientCategory/Humectant",
"name": "Humectant",
"worksWellWith": [
{"@id": "#FunctionalIngredientCategory/Occlusive"}
]
},
{
"@type": "FunctionalIngredientCategory",
"@id": "#FunctionalIngredientCategory/Occlusive",
"name": "Occlusive",
"worksWellWith": [
{"@id": "#FunctionalIngredientCategory/Humectant"}
]
}
]
}
Why bidirectional: Explicit declaration from both sides ensures the relationship is discoverable regardless of which category you start from.
Example 3: Treatment Category Synergies
Beyond skincare ingredients:
{
"@type": "FunctionalIngredientCategory",
"@id": "#Category/TopicalRetinoid",
"name": "Topical Retinoid",
"mechanismOfAction": "Increases cell turnover and collagen production via retinoic acid receptor activation",
"insufficientAlone": "Causes significant barrier disruption; photosensitivity requires additional protection",
"worksWellWith": [
{
"@type": "FunctionalIngredientCategory",
"@id": "#Category/CeramideMoisturiser",
"name": "Ceramide-containing moisturiser",
"description": "Restores barrier function disrupted by retinoid use"
},
{
"@type": "FunctionalIngredientCategory",
"@id": "#Category/BroadSpectrumSPF",
"name": "Broad-spectrum SPF",
"description": "Protects photosensitised skin from UV damage"
}
]
}
Why this works: Shows how worksWellWith applies to treatment categories, not just moisturising ingredients. The inline definitions include rationale for each synergy.
Example 4: Complete Lip Care Network
Full interconnected category definitions:
{
"@graph": [
{
"@type": "FunctionalIngredientCategory",
"@id": "#FunctionalIngredientCategory/Humectant",
"name": "Humectant",
"physiologicalRole": "Increases water content in tissue",
"insufficientAlone": "Cannot prevent evaporation; may worsen dryness in low humidity",
"worksWellWith": [
{"@id": "#FunctionalIngredientCategory/Occlusive"},
{"@id": "#FunctionalIngredientCategory/Emollient"}
]
},
{
"@type": "FunctionalIngredientCategory",
"@id": "#FunctionalIngredientCategory/Emollient",
"name": "Emollient",
"physiologicalRole": "Fills cellular gaps; provides sebum-like lipids",
"insufficientAlone": "Does not create sufficient barrier to prevent TEWL",
"worksWellWith": [
{"@id": "#FunctionalIngredientCategory/Humectant"},
{"@id": "#FunctionalIngredientCategory/Occlusive"}
]
},
{
"@type": "FunctionalIngredientCategory",
"@id": "#FunctionalIngredientCategory/Occlusive",
"name": "Occlusive",
"physiologicalRole": "Seals moisture; reduces TEWL by up to 99%",
"insufficientAlone": "Seals in whatever moisture exists; provides no nutrients or lipid replacement",
"worksWellWith": [
{"@id": "#FunctionalIngredientCategory/Humectant"},
{"@id": "#FunctionalIngredientCategory/Emollient"}
]
}
]
}
Why this works: Creates a queryable network where starting from any category, you can discover what completes it. Each category's limitation (insufficientAlone) is addressed by what it worksWellWith.
Implementation Notes
Graph Traversal
This property is designed for knowledge graph use. Example queries:
Find all complements of a category:
SELECT ?complement WHERE {
<#FunctionalIngredientCategory/Humectant> hs:worksWellWith ?complement .
}
Find categories that work well together:
SELECT ?cat1 ?cat2 WHERE {
?cat1 hs:worksWellWith ?cat2 .
?cat1 a hs:FunctionalIngredientCategory .
}
Find complete combinations (all three lip care categories):
SELECT ?product WHERE {
?product schema:containsIngredient ?ing1, ?ing2, ?ing3 .
?ing1 a hs:Humectant .
?ing2 a hs:Emollient .
?ing3 a hs:Occlusive .
}
JSON-LD Container
In the Health Schema context, worksWellWith is defined with @container: @list, preserving order if specified. However, the order typically has no semantic meaning—it's a set relationship.
Validation
Standard schema.org validators will not recognise this property. This is expected for Health Schema extensions. The property is defined in the Health Schema context and will be correctly interpreted by systems that load this context.