diff --git a/spec/section/graphmap.md b/spec/section/graphmap.md
index 3c264c5..beae6f5 100644
--- a/spec/section/graphmap.md
+++ b/spec/section/graphmap.md
@@ -81,3 +81,8 @@ However, in this example, RDF triples of the [=predicate=] `ex:title` are placed
+## Scope of Blank Nodes
+
+[=Blank nodes=] in the [=output dataset=] are scoped to a single [=RDF graph=]. If the same [=blank node identifier=] occurs in multiple [=RDF triples=] that are in the same graph, then the triples will share the same blank node. If, however, the same blank node identifier occurs in multiple graphs, then a distinct blank node be created for each graph. An RML-generated blank node can never be shared by two triples in two different graphs.
+
+This implies that triples generated from a single logical source row will have different subjects if the subjects are blank nodes and the triples are placed into different graphs.
\ No newline at end of file
diff --git a/spec/section/mapping.md b/spec/section/mapping.md
index 59e5ce9..8e0d559 100644
--- a/spec/section/mapping.md
+++ b/spec/section/mapping.md
@@ -62,13 +62,14 @@ A subject map is a [=term map=]. It specifies a rule for generating t
## Typing Resources (rml:class)
-A [=subject map=] MAY have one or more _**class IRIs**_. They are represented by the `rml:class` property.
+A class IRI is an [=IRI=] that denotes an [=RDFS class=].
+A [=subject map=] MAY have one or more [=class IRIs=]. They are represented by the `rml:class` property.
The values of the `rml:class` property MUST be [=IRIs=].
For each [=RDF term=] generated by the [=subject map=], [=RDF triples=] with [=predicate=] `rdf:type` and the class [=IRI=] as [=object=] will be generated.
diff --git a/spec/section/output.md b/spec/section/output.md
index f5c81dc..3a83843 100644
--- a/spec/section/output.md
+++ b/spec/section/output.md
@@ -17,24 +17,23 @@ RDF syntaxes and RDF APIs generally represent [=blank nodes=] with [=blank node
## The Generated RDF Triples of a Triples Map
+This subsection describes the process of generating RDF triples from a [=Triples Map=]. This process contributes [=RDF triples=] to the [=output dataset=]. Each generated triple MUST be placed into one or more graphs of the output dataset.
-This subsection describes the normative process by which [=RDF triples=] are generated from a [=Triples Map=]. This process contributes [=RDF triples=] to the [=output dataset=]. Each generated triple MUST be placed into one or more graphs of the output dataset.
-
-The generated RDF triples are determined by the following algorithm. [=RML Processors=] MAY employ alternative implementations to compute the generated [=RDF triples=], provided that the resulting output dataset is semantically equivalent to the one obtained by this algorithm.
+The [=generated RDF triples=] are determined by the following algorithm. [=RML Processors=] MAY employ alternative implementations to compute the generated [=RDF triples=], provided that the resulting output dataset is semantically equivalent to the one obtained by this algorithm.
Let:
- **sm** be the [=subject map=] of the [=Triples Map=].
-- **records** be the set of logical records obtained by evaluating the [=logical source=] of the [=Triples Map=] using its declared [=reference formulation=].
-- **classes** be the set of class [=IRIs=] defined in **sm** (via `rml:class`).
+- **iterations** be the set of [=logical iterations=] obtained by evaluating the [=logical source=] of the [=Triples Map=] using its declared [=reference formulation=].
+- **classes** be the set of [=class IRIs=] defined in **sm** (via `rml:class`).
- **sgm** be the set of [=graph maps=] attached to **sm**.
-For each logical record **record** in **records**, apply the following steps:
+For each [=logical iteration=] **iteration** in **iterations**, apply the following steps:
-1. Let [=subject=] be the [=RDF term=] resulting from applying **sm** to **record**.
-2. Let **subject_graphs** be the set of [=RDF term=] resulting from applying each graph map in **sgm** to **record**.
-3. For each class [=IRI=] in **classes**, add a triple to the [=output dataset=] as follows:
+1. Let [=subject=] be the [=generated RDF term=] resulting from applying **sm** to **iteration**.
+2. Let **subject_graphs** be the set of [=generated RDF terms=] resulting from applying each graph map in **sgm** to **iteration**.
+3. For each [=class IRI=] in **classes**, add a triple to the [=output dataset=] as follows:
| Component | Value |
|------------|--------|
@@ -45,10 +44,10 @@ For each logical record **record** in **records**, apply the following steps:
4. For each [=predicate-object map=] of the Triples Map, apply the following steps:
- - Let **predicates** be the set of [=RDF terms=] resulting from applying each predicate map of the predicate-object map to **record**.
- - Let **objects** be the set of [=RDF terms=] resulting from applying each object map (excluding [=referencing object maps=]) to **record**.
+ - Let **predicates** be the set of [=generated RDF terms=] resulting from applying each predicate map of the predicate-object map to **iteration**.
+ - Let **objects** be the set of [=generated RDF terms=] resulting from applying each [=object map=] (excluding [=referencing object maps=]) to **iteration**.
- Let **pogm** be the set of graph maps of the predicate-object map.
- - Let **predicate_object_graphs** be the set of RDF terms resulting from applying each graph map in **pogm** to **record**.
+ - Let **predicate_object_graphs** be the set of [=generated RDF terms=] resulting from applying each [=graph map=] in **pogm** to **iteration**.
For each possible combination ``, where *predicate* ∈ **predicates** and *object* ∈ **objects**, add a triple to the output dataset as follows:
@@ -64,15 +63,15 @@ For each [=referencing object map=] of a [=predicate-object map=] in the [=Tripl
- Let **psm** be the [=subject map=] of the [=parent Triples Map=] referenced by [=referencing object map=].
- Let **pogm** be the set of [=graph maps=] of the [=predicate-object map=].
-- Let **joined_records** be the result of evaluating the [=join conditions=] defined by the [=referencing object map=], combining records from both the child and parent logical sources.
+- Let **joined_iterations** be the result of evaluating the [=join conditions=] defined by the [=referencing object map=], combining iterations from both the [=child logical source=] and [=parent logical sources=].
-For each pair `` in **joined_records**, apply the following steps:
+For each pair `` in **joined_iterations**, apply the following steps:
-1. Let **subject** be the [=RDF terms=] resulting from applying **sm** to **child_record**.
-2. Let **predicates** be the set of [=RDF terms=] resulting from applying each [=predicate map=] of the [=predicate-object map=] to **child_record**.
-3. Let **object** be the [=RDF terms=] resulting from applying **psm** to **parent_record**.
-4. Let **subject_graphs** be the set of RDF terms resulting from applying each graph map in **sgm** to **child_record**.
-5. Let **predicate_object_graphs** be the set of RDF terms resulting from applying each graph map in **pogm** to **child_record**.
+1. Let **subject** be the [=generated RDF term=] resulting from applying **sm** to **child_iteration**.
+2. Let **predicates** be the set of [=generated RDF terms=] resulting from applying each [=predicate map=] of the [=predicate-object map=] to **child_iteration**.
+3. Let **object** be the [=generated RDF term=] resulting from applying **psm** to **parent_iteration**.
+4. Let **subject_graphs** be the set of [=generated RDF terms=] resulting from applying each [=graph map=] in **sgm** to **child_iteration**.
+5. Let **predicate_object_graphs** be the set of [=generated RDF terms=] resulting from applying each graph map in **pogm** to **child_iteration**.
For each *predicate* in **predicates**, add a triple to the output dataset as follows:
@@ -88,12 +87,12 @@ For each *predicate* in **predicates**, add a triple to the output dataset as fo
“Add triples to the output dataset” is a process that takes the following inputs:
-| Input | Description |
-|--------|-------------------------------------------------|
-| **Subject** | an [=IRI=], a [=URI=], [=blank node=], or empty |
-| **Predicate** | an [=IRI=], a [=URI=], or empty |
-| **Object** | an [=RDF term=] or empty |
-| **Target graphs** | a set of zero or more [=IRIs=] |
+| Input | Description |
+|--------|---------------------------|
+| **Subject** | an [=IRI=], [=blank node=], or empty |
+| **Predicate** | an [=IRI=], or empty |
+| **Object** | an [=RDF term=] or empty |
+| **Target graphs** | a set of zero or more [=IRIs=] |
Execute the following steps:
@@ -101,27 +100,27 @@ Execute the following steps:
2. Otherwise, generate an [=RDF triple=] ``.
3. If the set of target graphs includes `rml:defaultGraph`, add the triple to the [=default graph=] of the [=output dataset=].
4. For each [=IRI=] in the set of target graphs not equal to `rml:defaultGraph`, add the triple to the [=named graph=] identified by that [=IRI=] in the [=output dataset=].
- - If the [=named graph=] does not yet exist, create it.
-5. RDF graphs MUST NOT contain duplicate triples. Adding multiple identical triples to the same graph has the same effect as adding it once.
-6. The scope of blank nodes is limited to the output dataset being generated.
+ - If the [=named graph=] does not yet exist, create it.
+
+RDF graphs MUST NOT contain duplicate triples. Adding multiple identical triples to the same graph has the same effect as adding it once. Also note the [[[#scope-of-blank-nodes]]].
### Generated RDF Term of a Term Map
A [=term map=] defines how an [=RDF term=] is generated from the evaluation of a [=logical iteration=] over a [=logical source=].
-The result of evaluating a term map for a given logical record can be one of the following:
+The result of evaluating a term map for a given [=logical iteration=] can be one of the following:
-- **Empty**, if any referenced value of the [=term map=] evaluates to a null, empty or missing value (each data format defines it in [RML-IO-Registry](https://w3id.org/kg-construct/rml-io-registry/));
-- **An [=RDF term=]**, when evaluation produces a valid [=RDF term=]according to the [=term generation rules=];
-- **A data error**, when a valid RDF term cannot be produced.
+- **Empty**, if the [=expression evaluation result=] of the [=term map=] evaluates to a null, empty or missing value (each data format defines it in [RML-IO-Registry](https://w3id.org/kg-construct/rml-io-registry/));
+- **An [=RDF term=]**, when evaluation produces a valid [=RDF term=] according to the [=term generation rules=];
+- **A [=data error=]**, when a valid RDF term cannot be produced.
-The [=generated RDF term=] of a [=term map=] for a given logical record is determined as follows:
+The [=generated RDF term=] of a [=term map=] for a given [=logical iteration=] is determined as follows:
-1. If the term map is a **constant-valued term map**, then the generated RDF term is the term map’s constant value.
-2. If the term map is a **reference-valued term map**, then the generated RDF term is determined by evaluating the [=reference value=] expression over the logical record and applying the *term generation rules* to the resulting value.
-3. If the term map is a **template-valued term map**, then the generated RDF term is determined by evaluating the [=template value=] against the logical record and applying the *term generation rules* to the resulting value.
+1. If the term map is a [=constant-valued term map=], then the generated RDF term is the term map’s [=constant value=].
+2. If the term map is a [=reference-valued term map=], then the generated RDF term is determined by applying the [=term generation rules=] to its [=reference value=].
+3. If the term map is a [=template-valued term map=], then the generated RDF term is determined by applying the [=term generation rules=] to the [=template value=].
-The term generation rules define how a concrete RDF term is generated from a given value:
+The term generation rules define how a concrete RDF term is generated from each value from an [=expression evaluation result=]:
1. **If the value is null, empty or missing**, then no RDF term is generated.
@@ -141,9 +140,9 @@ The term generation rules define how a concrete RDF term is generated
- Return a blank node that is unique in the target graph.
5. **If the term type is `rml:Literal`:**
- - If the term map declares a [=language tag=], then return a literal with that language tag and the natural RDF lexical form corresponding to *value*.
- - Otherwise, if the term map declares a non-empty [=datatype=] different from the natural RDF datatype corresponding to the value’s implicit datatype, then return an RDF literal with the specified datatype.
- - Otherwise, return the natural RDF literal corresponding to *value*.
+ - If the term map declares a [=language map=], then evaluate the [=language map=] to obtain a [=language tag=] and return a literal with that [=language tag=] and the natural RDF lexical form corresponding to *value*.
+ - Otherwise, if the term map declares a [=datatype map=], then evaluate it to obtain a [=datatype-override RDF literal=] corresponding to *value* and the specified datatype.
+ - Otherwise, return the [=natural RDF literal=] corresponding to *value*.
diff --git a/spec/section/terminology.md b/spec/section/terminology.md
index 0975a7c..2df33d5 100644
--- a/spec/section/terminology.md
+++ b/spec/section/terminology.md
@@ -27,6 +27,11 @@ This section lists some terms normatively defined in [[RDF11-CONCEPTS]] and used
- resource
- subject
+## RDFS Terminology
+
+This section lists some terms normatively defined in [[RDF11-SCHEMA]] and used in RML:
+
+- RDFS class
# XML Schema Definition Language (XSD) Terminology