Skip to main content

Querying the E-Commerce Catalog

In this walkthrough, we'll explore the product catalog using progressively complex queries. You'll learn how to traverse the graph, filter results, and aggregate data.

Alex Browses the Store

Alex wants to find a new smartphone. Let's help them navigate the catalog.

List All Products

Start with a simple query to see what products are available:


{
"@context": {
"ecom": "https://ecommerce-example.com/ns/",
"schema": "http://schema.org/"
},
"select": { "?product": ["*"] },
"where": { "@id": "?product", "@type": "ecom:Product" }
}

This returns all products with their properties. But Alex wants to see products organized by category.

Products with Category Info

Let's include the category name by traversing the graph:


{
"@context": {
"ecom": "https://ecommerce-example.com/ns/",
"schema": "http://schema.org/"
},
"select": {
"?product": ["schema:name", "ecom:basePrice"],
"?categoryName": []
},
"where": [
{ "@id": "?product", "@type": "ecom:Product", "ecom:category": "?category" },
{ "@id": "?category", "schema:name": "?categoryName" }
]
}

Now we see each product with its category name. The where clause traverses from product → category → name.

Filter by Category

Alex only wants smartphones. We can filter using values:


{
"@context": {
"ecom": "https://ecommerce-example.com/ns/",
"schema": "http://schema.org/"
},
"select": {
"?product": ["schema:name", "schema:description", "ecom:basePrice"]
},
"where": { "@id": "?product", "@type": "ecom:Product", "ecom:category": "?category" },
"values": [
["?category"],
[{"@id": "ecom:categories/electronics/phones/smartphones"}]
]
}

This returns only products in the Smartphones category: SmartPhone Pro X, SmartPhone Lite, and GamePhone Ultra.

Filter by Price Range

Alex has a budget. Let's find smartphones under $800:


{
"@context": {
"ecom": "https://ecommerce-example.com/ns/",
"schema": "http://schema.org/"
},
"select": {
"?product": ["schema:name", "ecom:basePrice"]
},
"where": [
{ "@id": "?product", "@type": "ecom:Product", "ecom:category": {"@id": "ecom:categories/electronics/phones/smartphones"}, "ecom:basePrice": "?price" },
["filter", "(< ?price 800)"]
]
}

Result: SmartPhone Lite ($499.99) and GamePhone Ultra ($799.99).

info

The filter clause uses comparison operators like <, >, <=, >=, and = to constrain numeric values.

Find In-Stock Variants

Alex wants to see available variants. Let's find variants with stock > 0:


{
"@context": {
"ecom": "https://ecommerce-example.com/ns/",
"schema": "http://schema.org/"
},
"select": {
"?product": ["schema:name"],
"?variant": ["ecom:color", "ecom:storage", "ecom:price", "ecom:stockQuantity"]
},
"where": [
{ "@id": "?product", "@type": "ecom:Product", "ecom:variants": "?variant" },
{ "@id": "?variant", "ecom:stockQuantity": "?stock" },
["filter", "(> ?stock 0)"]
]
}

This traverses product → variants and filters out any with zero stock (like the Racing Red SportBuds).

Category Hierarchy Traversal

One of the most powerful graph features is traversing hierarchies. Let's find all products in "Electronics" including subcategories:


{
"@context": {
"ecom": "https://ecommerce-example.com/ns/",
"schema": "http://schema.org/"
},
"select": {
"?product": ["schema:name"],
"?categoryName": []
},
"where": [
{ "@id": "?product", "@type": "ecom:Product", "ecom:category": "?leafCategory" },
{ "@id": "?leafCategory", "ecom:parentCategory*": {"@id": "ecom:categories/electronics"}, "schema:name": "?categoryName" }
]
}

The * modifier on parentCategory* enables transitive traversal—it follows the parent chain up to the Electronics category. This returns all phones, laptops, and audio products.

Get Product Reviews

Let's see what customers think about a specific product:


{
"@context": {
"ecom": "https://ecommerce-example.com/ns/",
"schema": "http://schema.org/"
},
"select": {
"?review": ["ecom:rating", "schema:reviewBody", "schema:datePublished"],
"?reviewerName": []
},
"where": [
{ "@id": "?review", "@type": "ecom:Review", "ecom:product": {"@id": "ecom:products/smartphone-pro-x"}, "ecom:reviewer": "?reviewer" },
{ "@id": "?reviewer", "schema:givenName": "?reviewerName" }
],
"orderBy": [{"desc": "?rating"}]
}

This query:

  1. Finds reviews for the SmartPhone Pro X
  2. Traverses to the reviewer to get their name
  3. Orders by rating (highest first)

Calculate Average Rating

Let's aggregate ratings to find the average:


{
"@context": {
"ecom": "https://ecommerce-example.com/ns/",
"schema": "http://schema.org/"
},
"select": ["?productName", "(avg ?rating)"],
"where": [
{ "@id": "?review", "@type": "ecom:Review", "ecom:product": "?product", "ecom:rating": "?rating" },
{ "@id": "?product", "schema:name": "?productName" }
],
"groupBy": "?productName",
"orderBy": [{"desc": "(avg ?rating)"}]
}

This groups reviews by product and calculates the average rating, sorted from highest to lowest. Great for finding top-rated products!

Find Products by Brand

Alex prefers TechPro products. Let's filter by brand:


{
"@context": {
"ecom": "https://ecommerce-example.com/ns/",
"schema": "http://schema.org/"
},
"select": {
"?product": ["schema:name", "schema:description", "ecom:basePrice"]
},
"where": [
{ "@id": "?product", "@type": "ecom:Product", "ecom:brand": "?brand" },
{ "@id": "?brand", "schema:name": "TechPro" }
]
}

Returns SmartPhone Pro X and SmartPhone Lite—all TechPro products.

Summary

In this walkthrough, you learned how to:

TechniqueExample
Basic selectionselect: { "?product": ["*"] }
Graph traversalProduct → Category → Name
Filtering with valuesConstrain to specific category
Numeric filtersPrice < 800
Transitive traversalparentCategory* for hierarchy
Aggregation(avg ?rating) with groupBy
OrderingorderBy: [{"desc": "?rating"}]

Next, learn how to add and update data in the catalog.