<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Integrating Semantic Web Technologies and ASP for Product Configuration</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Stefan Bischof</string-name>
          <email>bischof.stefan@siemens.com</email>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Gottfried Schenner</string-name>
          <email>gottfried.schenner@siemens.com</email>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Richard Taupe</string-name>
          <email>richard.taupe@siemens.com</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Alpen-Adria-Universität</institution>
          ,
          <addr-line>Klagenfurt</addr-line>
          ,
          <country country="AT">Austria</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Siemens AG Österreich, Corporate Technology</institution>
          ,
          <addr-line>Vienna</addr-line>
          ,
          <country country="AT">Austria</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>Currently there is no single dominating technology for building product configurator systems. While research often focuses on a single technology/paradigm, building an industrial-scale product configurator system will almost always require the combination of various technologies for different aspects of the system (knowledge representation, reasoning, solving, user interface, etc.) This paper demonstrates how to build such a hybrid system and how to integrate various technologies and leverage their respective strengths. Due to the increasing popularity of the industrial knowledge graph we utilize Semantic Web technologies (RDF, OWL and the Shapes Constraint Language (SHACL)) for knowledge representation and integrate it with Answer Set Programming (ASP), a well-established solving paradigm for product configuration.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>INTRODUCTION</title>
      <p>
        The way large organizations manage their data is subject to
trends. Currently the (industrial) knowledge graph is gaining
popularity [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]. The term “knowledge graph” was coined by
Google [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ] in the context of search engines. This was adopted
by the industry to describe a system that manages the data
of a company with a graph-based formalism like RDF and
combines it with reasoning (e.g. OWL) and machine learning
[
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. Having all internal data of the company accessible in one
format solves the problem of isolated data silos often found in
large corporations and allows the combination of internal data
with external data e.g. from the Linked Open Data cloud [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ].
      </p>
      <p>Knowledge graphs rely heavily on methods and
technologies developed by the Semantic Web community. Given the
current acceptance in the industry for these technologies it is
a good time for the product configuration community to
revisit these technologies. In this paper we demonstrate how to
use Semantic Web technologies for product configuration and
how to integrate them with established solving technologies
for product configuration like Answer Set Programming.</p>
      <p>
        Why is the use of open standards and technologies like the
Semantic Web technology stack so important? In our
experience using a configurator with a vendor-specific language for
specifying product configuration problems is the equivalent of
a data silo in data management. It is very hard to switch from
one configurator vendor to another, if both systems use their
own proprietary specification language. Also in the product
configuration community there is currently no standard way
to specify product configuration problems although the topic
of ontologies and product configuration is over 20 years old
(cf. [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ]) and pre-dates the Semantic Web.
      </p>
      <p>In Section 2 we describe the technologies used for this
paper. In Section 3 we show how to define a product configurator
knowledge base with RDF and SHACL, that allows checking
of constraints and interactive solving.</p>
      <p>For solving product configuration problems, RDF and
SHACL are combined with Answer Set Programming in
Section 4. In Section 5 we illustrate how reasoning with OWL
can help to integrate the product configuration solutions into
the knowledge graph and facilitate reuse of ontologies.</p>
      <p>In Section 6 we give a brief overview of the systems used
for the examples and in Section 7 we conclude.
2</p>
    </sec>
    <sec id="sec-2">
      <title>PRELIMINARIES</title>
      <p>
        The proposed approach builds heavily on Semantic Web
standards and technologies. Instance data is represented as RDF
triples, domain models are mapped to domain-dependent
ontologies/vocabularies and queries are formulated in SPARQL
[
        <xref ref-type="bibr" rid="ref19">19</xref>
        ].
2.1
      </p>
    </sec>
    <sec id="sec-3">
      <title>RDF+SHACL</title>
      <p>
        The Resource Description Framework (RDF) [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] is a both
human-readable and machine-processable framework for
describing and representing information about resources. In
RDF every resource is identified by an IRI, and
information about resources is represented in form of triples with
I [ B I I [ B [ L, where I, B, L denote IRIs, blank nodes
(nodes that do not have a corresponding IRI and which are
mainly used to describe special types of resources without
explicitly naming them) and RDF literals (e.g., strings, integers,
etc.) respectively.
      </p>
      <p>
        The Shapes Constraint Language (SHACL) [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] – a W3C
Recommendation since 2017 – is a language for validating
RDF graphs against a set of constraints. Its validation
process is built around the notion of Data Graphs (RDF graphs
that contain the data that has to be validated), and Shapes
Graphs (RDF graphs containing shape definitions and other
information that is used to perform the validation of the Data
Graphs).
2.2
      </p>
    </sec>
    <sec id="sec-4">
      <title>Ontologies</title>
      <p>
        The OWL 2 Web Ontology Language (OWL) [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] is a
declarative knowledge representation formalism standardized by the
W3C in 2012. OWL is a language to represent ontologies and
is based on description logics.
      </p>
      <p>An ontology describes things (individuals), sets of
individuals (classes), relations between individuals (object
properties) and attributes of individuals (data properties). Based on
these, OWL provides class and property constructors to
define complex classes and properties, e.g., intersection or union
of classes. Eventually, with OWL axioms, we can define how
classes (and properties) are related to each other, e.g.,
subclasses, equivalent classes, or disjoint classes.</p>
      <p>
        OWL ontologies can be serialized in one of several syntaxes.
In this paper we use Turtle [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] syntax for serializing both OWL
and SHACL.
2.3
      </p>
    </sec>
    <sec id="sec-5">
      <title>Validation vs. Inference</title>
      <p>
        In the Semantic Web, the tasks of (i) constraint validation
and (ii) reasoning are grounded on different semantics. While
the latter usually operates under the Open World
Assumption (OWA) (i.e., a statement cannot be assumed to be false
if it cannot be proven to be true [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ]) and the Non-Unique
Name Assumption (nUNA) (i.e., the same resource can have
multiple names), validation adheres to the Closed World
Assumption (CWA) (i.e., a statement is assumed to be false if it
cannot be proven to be true) and requires that different names
identify different objects (i.e., it makes the Unique Name
Assumption (UNA)).
      </p>
      <p>Those differences are illustrated in Figure 1 where OWL is
used for specifying a cardinality constraint for individuals of
type :ElementA allowing them to refer to exactly one module
of type :ModuleI only.</p>
      <p>ex:elemA
rdf:type</p>
      <p>
        Class ex:ElementA is defined to be equal to an
anonymous class having exactly one ex:ModuleI associated
via ex:requiredModule, hence every individual of type
ex:ElementA is only allowed to refer to one specific
module. Even though ex:elemA is violating its cardinality
constraint (because it is associated to more than one module
via ex:requiredModule) an OWL reasoner would not be able
to detect a violation, but instead infers that ex:moduleA and
ex:moduleB are representing the same thing.
2.4
Answer Set Programming (ASP) is a declarative
programming paradigm. Instead of specifying how to find a solution
to a problem in terms of an imperative algorithm, in ASP the
problem itself is specified in the form of a logic program. We
restrict our introduction to ASP to core concepts needed to
understand this paper and refer to [
        <xref ref-type="bibr" rid="ref10 ref11 ref5">5, 10, 11</xref>
        ] for more details.
      </p>
      <p>A program P is a finite set of rules of the form
h : - b1 , : : :, bm , not bm+1 , : : :, not bn .
where h and b1; : : : ; bm are positive literals (i.e. atoms) and
not bm+1; : : : ; not bn are negative literals. An atom is either
a classical atom or a cardinality atom. A classical atom is
an expression p(t1; : : : ; tn) where p is an n-ary predicate and
t1; : : : ; tn are terms. A term is either a variable (whose name
starts with an upper-case character or an underscore) or a
constant (which can be a number or a string). A literal is
either an atom or its default negation not . Default negation
refers to the absence of information, i.e. an atom is assumed
to be false as long as it is not proven to be true. Thus, ASP
makes the Closed World Assumption.</p>
      <p>A cardinality atom is of the form
l
l { a1 : l 11 , : : : , l 1m ; : : : ; an : l n1 , : : : , l no }
u u
where each structure ai : li1 ; : : : ; lim is a conditional literal
in which ai (the head of the conditional literal) and all lij
are classical literals, and l and u are terms representing
nonnegative integers indicating lower and upper bound. If one
or both of the bounds are not given, their defaults are used,
which are 0 for l (and for l) and 1 for u (and for u).</p>
      <p>H (r) = fhg is called the head of the rule, and B (r) =
fb1; : : : ; bm; not bm+1; : : : ; not bng is called the body of the
rule. A rule with empty head is a constraint and is used to
filter out invalid solutions. A rule with empty body is called
fact, its head holds unconditionally in a satisfiable program.</p>
      <p>
        There are several ways to define the semantics of an
answerset program, i.e. to define the set of answer sets AS (P ) of an
answer-set program P . An overview is provided by [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ].
Informally, an answer set A of a program P is a subset-minimal
model of P (i.e. a set of atoms interpreted as true) which
satisfies the following conditions: All rules in P are satisfied by
A; and all atoms in A are “derivable” by rules in P . A rule
is satisfied if its head is satisfied or its body is not. A
cardinality atom is satisfied if l l jCj u u holds, where C is the
set of head atoms in the cardinality literal whose conditions
(e.g. li1 ; : : : ; lim for ai) are satisfied and which are satisfied
themselves.
      </p>
      <p>Most ASP systems split the solving process into grounding
and solving. The former part produces the grounding of a
program, i.e. its variable-free equivalent. Thereby, the variables
in each rule of the program are substituted by constants. The
latter part then solves this propositional encoding.</p>
      <p>To briefly illustrate ASP by means of a small example,
consider the following program:
triple ("ex: ElementA ", " rdfs : subClassOf ", "ex: Element ").
rdfs_subClassOf (Sub , Sup )
:triple (Sub , " rdfs : subClassOf ", Sup ).
class ( Sub ) :- rdfs_subClassOf (Sub , Sup ).
class ( Sup ) :- rdfs_subClassOf (Sub , Sup ).
n_element_types (N)
:N = { rdfs_subClassOf (Sub ,"ex: Element ") : class ( Sub ) }.
{
}
3</p>
      <p>This program contains one fact representing an RDF triple3
and two rules that derive new atoms from it. The single answer
set of this program is:
triple ("ex: ElementA "," rdfs : subClassOf ","ex: Element "),
rdfs_subClassOf ("ex: ElementA ","ex: Element "),
class ("ex: ElementA "), class ("ex: Element "),
n_element_types (1)</p>
      <p>
        PRODUCT CONFIGURATION WITH
SHACL
The following describes the product configuration
terminology from [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] adapted to RDF + SHACL.
      </p>
      <p>Definition 1 (Configuration Model) The (SHACL)
configuration model CONFMODEL = (SHAPEGRAPH, RDF)
consists of a SHACL shapes graph and an ontology/RDFS schema
defining all the used classes and properties in the configuration
model.</p>
      <p>Definition 2 (User requirements) The (SHACL) user
requirements USERREQ = (SHACLCONSTRAINTS,
SUBGRAPH) consists of additional SHACL constraints and an
initial RDF subgraph.</p>
      <p>Definition 3 (Configuration Task) The configuration task
CONFIGTASK = (CONFMODEL, USERREQ) represents
the input of one concrete configuration problem.</p>
      <p>Definition 4 (Configuration) A configuration (solution) of
a configuration task CONFIGTASK is an RDF graph,
which satisfies the SHACL constraints of CONFMODEL and
USERREQ and contains SUBGRAPH of USERREQ as a sub
graph.</p>
      <p>The configuration model defines the constraints that all
configurations must satisfy. The ontology is used to identify
the classes and properties relevant for the current
configuration task. In a large knowledge graph (RDF store/graph
database) there can be thousands of concepts and
properties and typically only a small subset is relevant for product
configuration. Even within the classes relevant for product
configuration not all will be relevant in the current
configuration task as the configuration task of large artefacts is
typically split into smaller configuration tasks like hardware
configuration and software configuration. Although the tasks
are separated, the resulting configurations will reside in the
same knowledge graph and will be linked, e.g., a hardware
component will be related to the required software driver.</p>
      <p>In the following we will illustrate the product configuration
concepts by means of an example.
3.1</p>
    </sec>
    <sec id="sec-6">
      <title>Running example</title>
      <p>
        For ease of comparison we use the example of [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ] as a running
example. This is an abstract example of a typical hardware
3 For conciseness, we use RDF prefixes also when we present ASP
encodings in this paper, even though the real encodings contain
full IRIs. For example, the string "rdfs:subClassOf" stands for
"http://www.w3.org/2000/01/rdf-schema#subClassOf".
configuration problem found in industry with some key
features like a component taxonomy, cardinality restrictions for
relations between component types, etc.
      </p>
      <p>In our example domain there may be different types of
elements, which are controlled by hardware modules. Each
hardware module must be in a frame and a frame must be mounted
on a rack. More specifically, the constraints of the domain are:
There are four disjoint types of elements
(ElementAElementD).</p>
      <p>There are five disjoint types of modules
(ModuleIModuleV).</p>
      <p>There are two disjoint types of racks (RackSingle,
RackDouble).</p>
      <p>An ElementA/B/C/D requires exactly one/two/three/four
ModuleI/II/III/IV respectively, i.e., an ElementB must
have only and exactly two ModuleIIs associated via the
requiredModule property.</p>
      <p>A ModuleV cannot have an element, all other modules must
be required by an element (via the requiredModule
property).</p>
      <p>A RackSingle must contain exactly four frames, a
RackDouble must contain exactly eight frames.</p>
      <p>A frame must be mounted on a rack.</p>
      <p>A frame can contain up to six modules.</p>
      <p>A module must be mounted on a frame.</p>
      <p>Whenever a frame contains a module of type ModuleII, it
must also contain one of type ModuleV.</p>
      <p>The ontology of our running example is illustrated in Fig. 2.
ex:requiredModule
ex:Element
ex:Module</p>
      <p>The following shows an excerpt of the ontology in turtle
format:
ex: ElementA rdfs : subClassOf ex: Element .
ex: ElementB rdfs : subClassOf ex: Element .
ex: ElementC rdfs : subClassOf ex: Element .
ex: ElementD rdfs : subClassOf ex: Element .
ex: ModuleI rdfs : subClassOf ex: Module .
ex: ModuleII rdfs : subClassOf ex: Module .
ex: ModuleIII rdfs : subClassOf ex: Module .
ex: ModuleIV rdfs : subClassOf ex: Module .
ex: ModuleV rdfs : subClassOf ex: Module .
# defines the objectproperty relating elements
# to their required modules
# the cardinality constraints for the objectproperty
# are defined with SHACL constraints
: requiredModule rdf : type owl : ObjectProperty ;
rdfs : domain : Element ;
rdfs : range : Module .
3.2</p>
    </sec>
    <sec id="sec-7">
      <title>SHACL constraints</title>
      <p>
        In the subsequent paragraphs, we illustrate some types of
constraints supported by SHACL that are relevant in the
configuration domain and refer to [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] for a full account of SHACL
constraints.
      </p>
      <p>Cardinality constraints A typical class of constraints for
industrial product configuration problems are cardinality
constraints. Whereas in customer product configuration
problems simple yes/no or mandatory/optional constraints
between components/features are often sufficient, complex
cardinality constraints are common in industrial configuration
problems, e.g., in our example each element class requires a
different number and type of attached module. In SHACL
these restrictions can be expressed with qualified cardinality
constraints. For example the constraint that each instance of
ex:ElementB requires exactly 2 ex:ModuleII can be expressed
like this:
ex: ElementBRequiredModuleShape
a sh: NodeShape ;
sh: targetClass ex: ElementB ;
sh: property [
sh: path ex: requiredModule ;
sh: minCount 2 ;
sh: maxCount 2 ;
sh: class ex: ModuleII ;
] .</p>
      <p>Cardinality constraints are a powerful mechanism of
product configuration models. With them it is possible to
express mandatory/optional, requires, and part/subpart
relationships. Almost all the constraints of our running example
can be expressed with cardinality constraints.</p>
      <p>Completeness of Taxonomy Typically in a
configuration model it is required that every object of a configuration
must be an instance of a leaf class in the taxonomy, e.g., if a
configuration contains a rack, it must be known whether it is
a RackSingle or a RackDouble. In SHACL this constraint can
be expressed as:
# subclass inheritance disjoint and complete
ex: RackSubclassShape
a sh: NodeShape ;
sh: targetClass ex: Rack ;
sh: message
"A Rack must be either of
type ex: RackSingle or ex: RackDouble " ;
sh: xone (
[ sh: class ex: RackSingle ]
[ sh: class ex: RackDouble ]
) .</p>
      <p>The reason for requiring completeness is that a
configuration should be a complete description of all components the
configured artefact contains. If the exact type of a component
is not known, the solution may be underspecified.</p>
      <p>There are some scenarios like ETO (engineer to order)
where this restriction does not apply. In these cases some
parts of the configured artefact are deliberately left
unspecified because it is the task of the engineering department to
come up with a solution, e.g., in our example we could add as
a SHACL constraint that every rack needs a power supply but
let the exact type of power supply unspecified. It is then the
task of the engineering department to find a suitable power
supply for the given configuration.
3.3</p>
    </sec>
    <sec id="sec-8">
      <title>Checking constraints</title>
      <p>Once we have defined the SHACL configuration model we can
use it to check if a given RDF graph is a valid configuration.
For example checking the RDF graph consisting of the single
triple ex:EB a ex:ElementB . against previously introduced
SHACL constraints produces the following validation result:</p>
      <p>The resulting configuration of this configuration task is
shown in Fig. 3 .</p>
      <p>Although that kind of interaction might be sufficient for
a domain expert, it is clear that the interactive
configuration task shown above can be improved. There are only two
points in the configuration task where a decision by the user
is required. The first decision is to create an ElementA and
the second decision is to choose between an RackSingle and
a RackDouble. All other statements could be automatically
derived by a reasoner.</p>
      <p>Some simple statements can be derived with an RDFS
reasoner. For example, ex:F2 a ex:Frame . follows from the
fact that ex:F2 is an object in an ex:frame property and this
property is defined to have the range ex:Frame.</p>
      <p>Other SHACL constraints cannot be repaired by a typical
Semantic Web reasoner because they require the creation of
new entities. For these cases SHACL rules can be applied.
The following example illustrates how SHACL rules could be
utilized to "repair" a SHACL constraint violation. This rule
creates frames for a rack until the required number of frames
was created.
ex: RackRuleShape
a sh: NodeShape ;
sh: targetClass ex: RackSingle ;
sh: rule [
a sh: SPARQLRule ;
sh: prefixes ex: ;
sh: construct """</p>
      <p>PREFIX ex: &lt;http :// example . org / confws2018 #&gt;
CONSTRUCT {
this ex: frame _: new .</p>
      <p>_: new a ex: Frame .
}</p>
      <p>WHERE { }
""" ;
sh: condition [ sh: not ex: RackSingleFrameShape ] ;
] .
4 SOLVING SHACL CONFIGURATIONS</p>
      <p>WITH ASP
Unfortunately, SHACL rules are a relatively new concept and
there are no rule engines that support backtracking. Therefore
one must revert to more established solving techniques for
product configuration. For this paper we decided to use ASP.</p>
      <p>As a basic proof of concept, we demonstrate the generic
translation of SHACL constraints to ASP for concepts needed
in the example illustrated in Section 3.1. As such, this
demonstration includes only a subset of the SHACL Core
Validators [9, Appendix D]. Most of the other validators can be
expressed in ASP as well4.
4.1</p>
    </sec>
    <sec id="sec-9">
      <title>General Concepts</title>
      <p>We represent RDF triples in ASP as instances of the ternary
predicate triple, whose arguments are Subject, Predicate,
and Object. For convenience, triples of certain RDF predicates
are mapped to smaller ASP atoms by a set of projection rules:
rdfs_subClassOf (Sub , Sup )
:triple (Sub ," rdfs : subClassOf ",Sup ).
a( Instance , Class )
:triple ( Instance ," rdf : type ",Class ).
sh_target_class (S, C) :- triple (S, "sh: targetClass ", C).
4 Validators that rely on string operations or data types are difficult
to encode in ASP.
sh_node_property (NS , PS) :- triple (NS , "sh: property ", PS ).
sh_property_shape (PS) :- triple (NS , "sh: property ", PS ).
sh_property_shape (PS)
:triple (PS , " rdf : type ", "sh: PropertyShape ").
sh_property_minCount (PS , Min )
:triple (PS , "sh: minCount ", Min ).
sh_property_maxCount (PS , Max )
:triple (PS , "sh: maxCount ", Max ).
sh_xone (S, List )
:triple (S, "sh: xone ", List ).</p>
      <p>To enable the reasoning component to not only rule out
invalid solutions but also explain inconsistencies, we use
shacl_constraint_violated atoms in the head of constraints
together with SHACL messages to encode explanations in the
form of shacl_constraint_violation_message atoms in
answer sets:
sh_message (S, Msg )
:</p>
      <p>triple (S,"sh: message ",Msg ).
shacl_constraint_violation_message (I,S, Msg )
:</p>
      <p>shacl_constraint_violated (I,S), sh_message (S, Msg ).
4.2</p>
    </sec>
    <sec id="sec-10">
      <title>Property Shapes</title>
      <p>Property shapes specify constraints that need to be fulfilled
by nodes that are reached on a SHACL property path, which
can be defined in various ways [9, Section 2.3]. These
constraints and paths need to be mapped to ASP concepts to
enable mapping of ASP constraints to the intended targets of
a SHACL property. A subset of these paths is handled by the
following encoding:
sh_property_path (PS , P)
:triple (PS , "sh: path ", P), not sh_path_is_inverse (P).
sh_path_is_inverse (P) :- triple (P, "sh: inversePath ", _).
sh_property_path_inv (PS , InvP )
:triple (PS , "sh: path ", P),
triple (P, "sh: inversePath ", InvP ).
shacl_property_target (PS , Trgt )
:sh_property_target_inst (PS , Inst , Trgt ).
sh_property_target_inst (PS , Inst , Trgt )
:sh_property_shape (PS), sh_node_property (NS , PS),
sh_property_path (PS , P), sh_targetClass (NS , Class ),
a(Inst , Class ), triple (Inst , P, Trgt ).
sh_property_target_inst (PS , Inst , Trgt )
:sh_property_shape (PS), sh_node_property (NS , PS),
sh_property_path_inv (PS , InvP ), sh_targetClass (NS , Class ),
a(Inst , Class ), triple (Trgt , InvP , Inst ).
4.3</p>
    </sec>
    <sec id="sec-11">
      <title>Class Membership</title>
      <p>As an example for a simple SHACL constraint, we provide
an encoding for the condition that a value node must be a
SHACL instance of a given type (cf. [9, Section 4.1.1]):
shape_constraint (S, class , C)
:triple (S, "sh: class ", C).
shape_constraint_satisfied_inst (I, S, class , C)
:shape_constraint (S, class , C), a(I, C).
4.4</p>
    </sec>
    <sec id="sec-12">
      <title>Cardinality Constraints</title>
      <p>Based on the encoding fragments presented so far we are now
able to encode detection of cardinality constraint violations
(cf. [9, Section 4.2]):
shacl_constraint_violated (I,PS)
:sh_property_shape (PS), sh_node_property (NS ,PS),
sh_target_class (NS ,C), a(I,C), sh_property_minCount (PS , Min ),
not Min { sh_property_target_inst (PS ,I,T) }.
shacl_constraint_violated (I,PS)
:sh_property_shape (PS), sh_node_property (NS ,PS),
sh_target_class (NS ,C), a(I,C), sh_property_maxCount (PS , Max ),
not { sh_property_target_inst (PS ,I,T) } Max .
4.5</p>
    </sec>
    <sec id="sec-13">
      <title>Logic Constraints</title>
      <p>Logic constraints like xone (cf. [9, Section 4.6]) can also be
mapped to cardinality constraints:
sh_xone_inst (Inst , List ) :- sh_xone (S, List ),
sh_target_class (S, Class ), a(Inst , Class ).
shacl_constraint_violated (Inst , S)
:sh_xone (S, List ), sh_xone_inst (Inst , List ),
not 1 {
shape_constraint_satisfied_inst (
Inst , List , Constraint , Value
) : shape_constraint (List , Constraint , Value )
} 1.
4.6</p>
    </sec>
    <sec id="sec-14">
      <title>Solving</title>
      <p>Given a translation of the SHACL constraints into ASP we
can check if the given RDF graph is a valid configuration, i.e.,
ASP acts as an implementation of the SHACL validator. To
enable solving, an additional generative program is needed.
This generative program must be capable of enumerating all
possible solutions within a certain scope. The generative
program together with the translated SHACL constraints enables
us to find a valid configuration, if one exists within the given
scope. The following listing shows a generative program
capable of enumerating all configurations consisting of racks and
frames. The scope is controlled by blank nodes (e.g., _:b1).
Every blank node can become a new component within the
configuration.
bnode ("_:b1").
bnode ("_:b2").
bnode ("_:b3").
bnode ("_:b4").
bnode ("_:b5").
bnode ("_:b6").
configobj (O)
:triple (O,"a",C),
configclass (C).
0 { triple ( BNODE , "a", "ex: RackSingle ") } 1
:bnode ( BNODE ).
0 { triple ( BNODE , "a", "ex: RackDouble ") } 1
:bnode ( BNODE ).
0 { triple ( BNODE , "a", "ex: Frame ") } 1
:</p>
      <p>bnode ( BNODE ).
0 { triple (O1 , "ex: frame ", O2 )} 1
:configobject (O1),
configobject (O2 ).
% answer set found
triple ("_:b1","a","ex: Rack ").
triple ("_:b1","a","ex: RackSingle ").
triple ("_:b2","a","ex: Frame ").
triple ("_:b3","a","ex: Frame ").
triple ("_:b4","a","ex: Frame ").
triple ("_:b5","a","ex: Frame ").
triple ("_:b1","ex: frame ","ex:b2").
triple ("_:b1","ex: frame ","ex:b3").
triple ("_:b1","ex: frame ","ex:b4").
triple ("_:b1","ex: frame ","ex:b5").</p>
      <p>After an answer set has been found due to the triple
notation it can be directly translated back to an RDF graph.
This RDF graph is a solution of the configuration task and
satisfies all SHACL constraints.
5</p>
      <p>COMBINING SHACL/RDF WITH
OWL REASONING
So far we have concentrated on closed world reasoning and
the unique name assumption for checking and finding
configurations. In practice there are applications for CWA/OWA
HardwarePart</p>
      <p>subpart
weight
xsd:int
and UNA/nUNA. As a use case for open world reasoning we
will demonstrate how to reuse an existing ontology for our
running example.
5.1</p>
      <p>Semantic differences of SHACL and</p>
      <p>OWL reasoning
Consider the constraint that a single rack has four frames.
Due to closed world reasoning the SHACL constraint is
violated in the example below. For a OWL reasoner the example
is consistent, because OWL adheres to the open world
assumption and thus an OWL reasoner would not be able to
decide if there is another frame.
ex:R1 a ex: RackSingle .
ex:R1 ex: frame ex:F1 .
ex:R1 ex: frame ex:F2 .
ex:R1 ex: frame ex:F3 .</p>
      <p>In the next example again a SHACL constraint will be
violated, because there are 5 frames associated with a Rack and
under the Unique Name Assumption they are all considered
different entities. In OWL this example is consistent, because
the unique name assumption is not applied and there is no
statement indicating that, e.g., ex:F1 and ex:F2 are different
entities.
ex:R1 a ex: RackSingle .
ex:R1 ex: frame ex:F1 .
ex:R1 ex: frame ex:F2 .
ex:R1 ex: frame ex:F3 .
ex:R1 ex: frame ex:F4 .
ex:R1 ex: frame other :FA .
5.2</p>
    </sec>
    <sec id="sec-15">
      <title>Reusing ontologies with OWL reasoning</title>
      <p>
        Modeling subpart relations can be surprisingly complicated
(cf. [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]), but is necessary in many knowledge representation
systems. For presentational reasons we opt for a simplistic
ontology: there exist hardware parts which can have subparts
which are also hardware parts. The subpart relation is
intentionally not defined as transitive and thus expresses only
direct subparts. Additionally each hardware part must have a
weight (see Fig. 4). Having hardware parts modeled along this
ontology, allows us to (recursively) compute the total weight
of a hardware part by adding the weight of the part itself with
the sum of the total weights of all (direct) subparts. However,
recursion is not needed, and so we will instead compute the
total weight of a hardware part by adding its own weight to the
weight to all (transitively reachable) subparts. The following
SPARQL query performs this computation for all hardware
parts (naturally the variable ?part in the WHERE clause could
be replaced by the URI of some hardware part):
hw:subpart ex:F1 hw:subpart ex:M1
hw:HardwarePart
ex:R1 hw:subpart
hw:subpart
      </p>
      <p>hw:subpart</p>
      <p>But before we can do that, we have to map the
configuration created previously to this Hardware Part ontology.
The mapping can be expressed by SHACL rules or a mapping
ontology. Taking the latter approach we can hold off on the
decision for a concrete implementation strategy. In our
example we only have to define the object properties ex:frame
and ex:module as subproperties of p:subpart in the mapping
ontology. Taking all the ontologies (example, subpart, and
mapping) and the racks configuration data into account, an
OWL reasoner would (also) entail the subpart relationships
depicted in Fig. 5. Depending on the OWL reasoner
implementation these entailments are materialised or only inferred
for relevant queries. Assuming the weights of the hardware
parts themselves are also available (for example through a
similar mapping to a product catalogue) we now have all the
necessary parts to compute the total weight of all the
hardware parts with the above SPARQL query.</p>
      <p>Alternatively we could use a similar query to materialise
the total weights in the RDF graph:
INSERT { ? part p: totalweight ? totalweight }
WHERE { {</p>
      <p>SELECT ? part ( SUM (? weight ) as ? totalweight )
WHERE {</p>
      <p>? part p: subpart */p: weight ? weight .</p>
      <p>} GROUP BY ? part
} }</p>
      <p>Using this mapping approach we can transparently map our
instance data with relevant data from other (legacy)
information systems via a knowledge graph and thus create a more
complete knowledge base. We therefore are able to reuse
ontologies like the Hardware Part ontology and the associated
SPARQL queries in a modular manner.
6</p>
    </sec>
    <sec id="sec-16">
      <title>EVALUATION</title>
      <p>All the example RDF files, ontologies, ASP and Java programs
are available in our open-source git repository5. For
manipulating RDF the Apache Jena library version 3.5.06 was used.
For checking SHACL constraints we relied on the TopBraid
SHACL API version 1.1.07. The SHACL examples can also
5 https://github.com/siemens/ProductConfigurationWithSHACL
6 https://jena.apache.org/
7 https://github.com/TopQuadrant/shacl
ex:F2
ex:F3
a
a
a
ex:F4
a
a
be checked online interactively by using the SHACL
playground8. The SHACL rule example has been implemented
in Java. The translation of the SHACL example to ASP is
also implemented in Java. For running the ASP programs we
used the ASP solver clingo version 5.2.09. The OWL
ontologies were edited with the Protégé ontology editor10 version
5.2. The classification example of 5 was verified with the
integrated HermiT reasoner. The example was also executed with
StarDog version 5.3.011 by using a SPARQL query with
activated OWL reasoning. StarDog is a knowledge graph platform
for the enterprise.
7</p>
    </sec>
    <sec id="sec-17">
      <title>CONCLUSION</title>
      <p>
        We have used Semantic Web technologies in the past, but
only for specific purposes like data integration [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ]. Product
configuration knowledge bases require closed world
reasoning and the default open world reasoning of OWL made it
cumbersome to be used for that task in our experience. We
found that SHACL closes this gap and have demonstrated
in this paper how to define a configurator knowledge base
just with RDF+SHACL. Together with constraint validation
such a system can be the basis of a simple interactive
configurator. SHACL rules can enhance the user experience by
deriving additional knowledge. We do not expect SHACL to
be the language for specifying product configuration problems
in combination with ontologies but it is a step into the right
direction.
      </p>
      <p>Because of the lack of backtracking SHACL rule engines,
SHACL rules can currently not be used to solve configurations
except for trivial examples. A solver for product configuration
problems finds a model for the product configuration model.
This is not a reasoning task supported by a typical Semantic
Web reasoner. The main task for a Semantic Web reasoner is
classification and determining consistency12.</p>
      <p>
        Therefore we resorted to ASP for solving the configuration
problem. To demonstrate the feasibility of the approach we
translated the subset of SHACL required to solve our simple
example domain. We will continue to evaluate our approach
on more sophisticated domains e.g. by adding arithmetic
constraints. Because the semantic of SHACL can be defined by
SPARQL and the expressive power of SPARQL [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] is
sufficient for typical product configuration domains we expect no
conceptual difficulties.
      </p>
      <p>
        The main challenge will be the automatic translation of the
SHACL constraints into ASP. In the future we want to adopt
a more generic approach by building on the work already done
for SPARQL and ASP [
        <xref ref-type="bibr" rid="ref14 ref15">14, 15</xref>
        ]. Of course such a translational
approach is not restricted to ASP. The same could be
applied to SAT, CSP or any other solving paradigm for product
configuration.
      </p>
      <p>An important topic for the future will be how to identify the
relevant information for product configuration in the
knowledge graph. This includes how to (semi-)automatically
identify the parts that are currently available for configuring a
8 http://shacl.org/playground/
9 https://potassco.org/
10 https://protege.stanford.edu/
11 https://www.stardog.com/
12 A Semantic Web reasoner might eventually produce a model
internally for proving consistency, but this is normally not
available to the caller of the reasoner.
product, how to relate the product configuration ontologies
to other relevant ontologies for product line management,
enterprise resource planning etc.</p>
    </sec>
    <sec id="sec-18">
      <title>ACKNOWLEDGEMENTS</title>
      <p>This work was partially conducted within the scope of
DynaCon (FFG-PNr.: 861263), which is funded by the
Austrian Federal Ministry of Transport, Innovation and
Technology (BMVIT) under the program “ICT of the Future”
between November 2017 and April 2020. More information:
https://iktderzukunft.at/en/</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>Renzo</given-names>
            <surname>Angles</surname>
          </string-name>
          and Claudio Gutierrez, '
          <article-title>The expressive power of sparql'</article-title>
          ,
          <source>in The Semantic Web - ISWC</source>
          <year>2008</year>
          , eds.,
          <string-name>
            <surname>Amit</surname>
            <given-names>Sheth</given-names>
          </string-name>
          , Steffen Staab,
          <string-name>
            <given-names>Mike</given-names>
            <surname>Dean</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Massimo</given-names>
            <surname>Paolucci</surname>
          </string-name>
          , Diana Maynard,
          <string-name>
            <surname>Timothy Finin</surname>
          </string-name>
          , and Krishnaprasad Thirunarayan, pp.
          <fpage>114</fpage>
          -
          <lpage>129</lpage>
          , Berlin, Heidelberg, (
          <year>2008</year>
          ). Springer Berlin Heidelberg.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>David</given-names>
            <surname>Beckett</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Tim</given-names>
            <surname>Berners-Lee</surname>
          </string-name>
          ,
          <article-title>Eric Prud'hommeaux, and Gavin Carothers, 'RDF 1.1 Turtle - terse RDF triple language'</article-title>
          , Recommendation,
          <string-name>
            <surname>W3C</surname>
          </string-name>
          , (
          <year>February 2014</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>Luigi</given-names>
            <surname>Bellomarini</surname>
          </string-name>
          , Georg Gottlob, Andreas Pieris, and Emanuel Sallinger, '
          <article-title>Swift logic for big data and knowledge graphs'</article-title>
          ,
          <source>in Proceedings of the Twenty-Sixth International Joint Conference on Artificial Intelligence, IJCAI</source>
          <year>2017</year>
          , Melbourne, Australia,
          <source>August 19-25</source>
          ,
          <year>2017</year>
          , ed.,
          <source>Carles Sierra</source>
          , pp.
          <fpage>2</fpage>
          -
          <lpage>10</lpage>
          . ijcai.org, (
          <year>2017</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>Christian</given-names>
            <surname>Bizer</surname>
          </string-name>
          , Tom Heath, and
          <string-name>
            <surname>Tim</surname>
          </string-name>
          Berners-Lee, '
          <article-title>Linked data - the story so far'</article-title>
          ,
          <source>Int. J. Semantic Web Inf. Syst.</source>
          ,
          <volume>5</volume>
          (
          <issue>3</issue>
          ),
          <fpage>1</fpage>
          -
          <lpage>22</lpage>
          , (
          <year>2009</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>Gerhard</given-names>
            <surname>Brewka</surname>
          </string-name>
          , Thomas Eiter, and Mirosław Truszczyński, '
          <article-title>Answer set programming at a glance'</article-title>
          ,
          <source>Communications of the ACM</source>
          ,
          <volume>54</volume>
          (
          <issue>12</issue>
          ),
          <fpage>92</fpage>
          -
          <lpage>103</lpage>
          , (
          <year>2011</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>Richard</given-names>
            <surname>Cyganiak</surname>
          </string-name>
          , David Wood, and Markus Lanthaler, '
          <article-title>Resource Description Framework (RDF)'</article-title>
          , Recommendation,
          <string-name>
            <surname>W3C</surname>
          </string-name>
          , (
          <year>February 2014</year>
          ). Available at https://www.w3.org/TR/ rdf11-concepts/.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>Mariano</given-names>
            <surname>Fernández-López</surname>
          </string-name>
          ,
          <article-title>Asunción Gómez-Pérez, and Mari Carmen Suárez-Figueroa, 'Selecting and customizing a mereology ontology for its reuse in a pharmaceutical product ontology'</article-title>
          ,
          <source>in Proceedings of the 2008 Conference on Formal Ontology in Information Systems: Proceedings of the Fifth International Conference (FOIS</source>
          <year>2008</year>
          ), pp.
          <fpage>181</fpage>
          -
          <lpage>194</lpage>
          , Amsterdam, The Netherlands, The Netherlands, (
          <year>2008</year>
          ). IOS Press.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>Lothar</given-names>
            <surname>Hotz</surname>
          </string-name>
          , Alexander Felfernig, Markus Stumptner, Anna Ryabokon, Claire Bagley, and Katharina Wolter, 'Chapter 6
          <article-title>- configuration knowledge representation and reasoning', in Knowledge-Based Configuration</article-title>
          , eds.,
          <string-name>
            <surname>Alexander</surname>
            <given-names>Felfernig</given-names>
          </string-name>
          , Lothar Hotz, Claire Bagley, and Juha Tiihonen,
          <fpage>41</fpage>
          -
          <lpage>72</lpage>
          , Morgan Kaufmann, Boston, (
          <year>2014</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>Holger</given-names>
            <surname>Knublauch</surname>
          </string-name>
          and Dimitris Kontokostas, '
          <article-title>Shapes Constraint Language (SHACL)'</article-title>
          , Recommendation,
          <string-name>
            <surname>W3C</surname>
          </string-name>
          , (
          <year>July 2017</year>
          ). Available at https://www.w3.org/TR/shacl/.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <surname>Vladimir</surname>
            <given-names>Lifschitz</given-names>
          </string-name>
          , '
          <article-title>What Is Answer Set Programming?'</article-title>
          ,
          <source>in Twenty-Third AAAI Conference on Artificial Intelligence</source>
          , (
          <year>2008</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <surname>Vladimir</surname>
            <given-names>Lifschitz</given-names>
          </string-name>
          , '
          <article-title>Thirteen Definitions of a Stable Model'</article-title>
          ,
          <source>in Fields of Logic</source>
          and Computation, eds.,
          <string-name>
            <surname>Andreas</surname>
            <given-names>Blass</given-names>
          </string-name>
          ,
          <source>Nachum Dershowitz, and Wolfgang Reisig</source>
          , volume
          <volume>6300</volume>
          of Lecture Notes in Computer Science,
          <volume>488</volume>
          -
          <fpage>503</fpage>
          , Springer, Berlin, Heidelberg, (
          <year>2010</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12] W3C OWL Working Group, '
          <article-title>Owl 2 web ontology language: Document overview'</article-title>
          , Recommendation,
          <string-name>
            <surname>W3C</surname>
          </string-name>
          , (
          <year>October 2009</year>
          ). Available at http://www.w3.org/TR/owl2-overview/.
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <article-title>Exploiting Linked Data and Knowledge Graphs in Large Organisations</article-title>
          , eds., Jeff
          <string-name>
            <given-names>Z.</given-names>
            <surname>Pan</surname>
          </string-name>
          , Guido Vetere,
          <string-name>
            <surname>José Manuél</surname>
          </string-name>
          Gómez-Pérez, and Honghan Wu, Springer,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <surname>Axel</surname>
            <given-names>Polleres</given-names>
          </string-name>
          , '
          <article-title>From SPARQL to rules (and back)'</article-title>
          ,
          <source>in Proceedings of the 16th International Conference on World Wide Web, WWW</source>
          <year>2007</year>
          , Banff, Alberta, Canada, May 8-
          <issue>12</issue>
          ,
          <year>2007</year>
          , eds., Carey L.
          <string-name>
            <surname>Williamson</surname>
          </string-name>
          , Mary Ellen Zurko,
          <string-name>
            <surname>Peter F. Patel-Schneider</surname>
          </string-name>
          , and
          <string-name>
            <surname>Prashant J. Shenoy</surname>
          </string-name>
          , pp.
          <fpage>787</fpage>
          -
          <lpage>796</lpage>
          . ACM, (
          <year>2007</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>Axel</given-names>
            <surname>Polleres</surname>
          </string-name>
          and Johannes Peter Wallner, '
          <article-title>On the relation between sparql1. 1 and answer set programming'</article-title>
          ,
          <source>Journal of Applied Non-Classical Logics</source>
          ,
          <volume>23</volume>
          (
          <issue>1-2</issue>
          ),
          <fpage>159</fpage>
          -
          <lpage>212</lpage>
          , (
          <year>2013</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <surname>Raymond</surname>
            <given-names>Reiter</given-names>
          </string-name>
          , '
          <article-title>On closed world data bases', in Logic and</article-title>
          Data Bases, eds.,
          <source>Hervé Gallaire and Jack Minker</source>
          ,
          <fpage>55</fpage>
          -
          <lpage>76</lpage>
          , Springer, (
          <year>1978</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <surname>Gottfried</surname>
            <given-names>Schenner</given-names>
          </string-name>
          , Stefan Bischof, Axel Polleres, and Simon Steyskal, '
          <article-title>Integrating distributed configurations with RDFS and SPARQL'</article-title>
          ,
          <source>in Configuration Workshop</source>
          , volume
          <volume>1220</volume>
          , pp.
          <fpage>9</fpage>
          -
          <lpage>15</lpage>
          , (
          <year>2014</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>Gottfried</given-names>
            <surname>Schenner</surname>
          </string-name>
          and Richard Taupe, '
          <article-title>Techniques for solving large-scale product configuration problems with ASP'</article-title>
          ,
          <source>in Proceedings of the 19th International Configuration Workshop</source>
          , eds., Linda L. Zhang and Albert Haag, pp.
          <fpage>12</fpage>
          -
          <lpage>19</lpage>
          ,
          <string-name>
            <surname>La</surname>
            <given-names>Défense</given-names>
          </string-name>
          , France, (
          <year>2017</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>Andy</given-names>
            <surname>Seaborne</surname>
          </string-name>
          and Steven Harris,
          <source>'SPARQL 1</source>
          .1
          <string-name>
            <given-names>Query</given-names>
            <surname>Language</surname>
          </string-name>
          <string-name>
            <surname>'</surname>
          </string-name>
          , Recommendation,
          <string-name>
            <surname>W3C</surname>
          </string-name>
          , (
          <year>March 2013</year>
          ). Available at https://www.w3.org/TR/sparql11-query/.
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <surname>Amit</surname>
            <given-names>Singhal</given-names>
          </string-name>
          , '
          <article-title>Introducing the knowledge graph: things, not strings'</article-title>
          ,
          <source>Official Google Blog</source>
          , (
          <year>2012</year>
          ). Available at https://www.blog.google/products/search/ introducing
          <article-title>-knowledge-graph-things-not.</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <surname>Timo</surname>
            <given-names>Soininen</given-names>
          </string-name>
          , Juha Tiihonen, Tomi Männistö, and Reijo Sulonen, '
          <article-title>Towards a general ontology of configuration'</article-title>
          ,
          <source>AI EDAM</source>
          ,
          <volume>12</volume>
          (
          <issue>4</issue>
          ),
          <fpage>357</fpage>
          -
          <lpage>372</lpage>
          , (
          <year>1998</year>
          ).
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>