<?xml version="1.0" encoding="windows-1250"?>
<!-- edited with XML Spy v3.0.7 NT (http://www.xmlspy.com) by David Cuyler (Sandia National Laboratories) -->
<?xml-stylesheet type="text/xsl" href="UMLProf.xsl"?>
<XMI xmlns="org.omg/XMI1.1" xmlns:UML="org.omg/UML1.3" xmi.version="1.1" timestamp="2000-07-11T9:00MST">
	<XMI.header>
		<XMI.documentation>
			<html xmlns="http://www.w3.org/1999/xhtml">Leveraging the UML Metamodel:<br/>Expressing ORM Semantics Using a UML Profile</html>
			<XMI.owner>David Cuyler, Sandia National Laboratories</XMI.owner>
			<XMI.contact>dscuyle@sandia.gov</XMI.contact>
			<XMI.notice>Sandia is a multiprogram laboratory operated by Sandia Corporation, a Lockheed Martin Company, for the United States Department of Energy under Contract DE-AC04-94AL85000.</XMI.notice>
			<XMI.shortDescription>
				<html xmlns="http://www.w3.org/1999/xhtml">
					<div>This paper is a proposal for a UML Profile to facilitate expression of Object Role Modeling semantics in terms of the <a href="http://cgi.omg.org/cgi-bin/doc?formal/00-03-01">UML 1.3 Metamodel</a>. It uses the extension mechanisms inherent to UML to clarify usage and semantics where necessary, and it proposes the use of the <a href="http://cgi.omg.org/cgi-bin/doc?ad/99-10-02">XML Metadata Interchange (XMI)</a> specification for model exchange.  Once expressed in terms of the UML Metamodel, ORM models can then be shared among UML-based tools and can be stored, managed and controled via UML-based repositories. The paper provides an example of an ORM model fragment converted to the XMI format, in accordance with the profile.</div>
				</html>
			</XMI.shortDescription>
			<XMI.longDescription>
				<html xmlns="http://www.w3.org/1999/xhtml">
					<h4>UML</h4>
					<div>Since its inception in the mid-1990s the <a href="http://cgi.omg.org/news/pr97/umlprimer.html">
Unified Modeling Language (UML)</a> has become the dominant Object Oriented software modeling language. The <a href="http://cgi.omg.org/cgi-bin/doc?formal/00-03-01">UML specification</a> prescribes both a diagram notation and a metamodel. The notation is particularly complete and capable as the means to document the structural and behavioral characteristics of software. However, modeling persistent storage structures has not been one of UML's strong points. The UML notation especially neglects constructs useful for precise analysis, design, development and management of relational schemata. Data modeling-specific notations and techniques have generally been stronger at this task than those oriented around UML.</div>
					<div>The UML metamodel, however, provides a structure that accommodates semantic information beyond what is typically expressed in the UML notation. In particular, the UML extension mechanisms of sterotypes, tagged values and constraints provide a basis for significantly expanding the applicability of the UML. This paper proposes a means by which the semantics of a specific data modeling notation (Object Role Modeling - ORM) could be accurately expressed in terms of the UML metamodel and its native extensions with no loss of semantic content.</div>
					<h4>XMI</h4>
					<div>Analysis and design tools today generally lack sufficient mechanisms for sharing content with other tools. Recently the <a href="http://www.omg.org/">OMG</a> has published the definition of <a href="http://cgi.omg.org/cgi-bin/doc?ad/99-10-02">XMI</a>, the XML Metadata Interchange Format, for interchange of model information among tools.</div>
					<div>XMI is not the first attempt to address the issue of a common format for sharing models. <a href="http://www.eia.org/eig/cdif/index.html">CASE Data Interchange Format</a> (CDIF), <a href="http://www.MDCinfo.com/MDIS/MDIS11.html">MetaData Interchange Specification</a> (MDIS) and <a href="http://www.metamodel.com/">others</a> represent attempts to define such a format. As an XML grammar, XMI has an advantage over its forerunners, in that XML is a freely published standard and is supported by a growing number of effective and inexpensive tools.</div>
					<h4>ORM</h4>
					<div>Object Role Modeling (ORM), as defined by the work of <a href="http://www.orm.net/halpin.html">Dr. Terry Halpin</a>, and with a heritage in Natural Language Information Analysis Method (NIAM), has one of the richest content models of any persistent modeling grammar. ORM is unique among information modeling techniques as it can be used to document a persistent data model for both relational and object schemata. Dr. Halpin has recently published several <a href="http://www.orm.net/uml_orm.html">works</a> comparing ORM with UML, and in them has implied that conversion of an ORM model to UML might be possible.
This paper provides a definition, in the form of a UML Profile, that provides the extensions necessary to perform this conversion and to accurately reflect the semantic content of an ORM model.</div>
					<div>ORM semantics and usage differ from those typically associated with UML primarily in the following areas:
						<ul>
							<li>What would normally be considered an Attribute in UML is represented in ORM as an Association (FactType).</li>
							<li>A typical ORM Constraint restricts the allowed population of an AssociationEnd (Role) or a set of AssociationEnds. This contrasts with the UML, where constraints typically govern whole Associations, Classes, or Behavioral Features.</li>
							<li>The ORM analysis process relies heavily on sample populations of associations (Links) to assist in the determination of Constraints. This is not consistently used in UML techniques.</li>
							<li>ORM methods are typically used to model persistent data stores, helping to optimize the data structure and reduce the incidence of anomalies in the population of the data store. UML is typically used to model run-time characteristics of software.</li>
						</ul> None of these differences violates intrinsic capabilities of the UML metamodel.  Rather they represent deviations from normal usage of the UML notation.</div>
				</html>
			</XMI.longDescription>
		</XMI.documentation>
		<XMI.model xmi.name="A UML Profile for Object Role Modeling" xmi.version="0.5" href="umlproform.xml">
			<XMI.reference href="http://cgi.omg.org/cgi-bin/doc?ad/99-10-02">XML Metadata
      Interchange (XMI) v.1.1 (Proposed)</XMI.reference>
			<XMI.reference href="http://cgi.omg.org/cgi-bin/doc?ad/99-12-32">Requirements for
      UML Profiles (Green Paper)</XMI.reference>
			<XMI.reference href="http://cgi.omg.org/cgi-bin/doc?ad/99-04-07">White Paper on the Profile mechanism</XMI.reference>
			<XMI.reference href="http://www.w3.org/XML">W3C XML 1.0 Definition</XMI.reference>
			<XMI.reference href="http://www.w3.org/Style/XSL">W3C XSL Definition</XMI.reference>
			<XMI.reference href="http://www.orm.net/">Object Role Modeling Web Site</XMI.reference>
			<XMI.reference href="http://www.orm.net/uml_orm.html">Dr. Terry Halpin on UML and ORM</XMI.reference>
			<XMI.reference href="http://www.inconcept.com/JCM/index.html">Journal of Conceptual
      Modeling</XMI.reference>
			<XMI.reference href="http://www.sdmagazine.com/uml/articles/s998dc1.shtml">Persistence Modeling in the UML</XMI.reference>
			<XMI.reference href="infou.xml">An ORM Model Expressed in Accordance With This Profile</XMI.reference>
			<XMI.reference href="xmi11-uml13.xsl">XSL to Transform an XMI Model to HTML</XMI.reference>
			<XMI.reference>
				<html xmlns="http://www.w3.org/1999/xhtml">Dr. Terry Halpin, 
			<i>Conceptual Schema and Relational Database Design, revised 2nd ed.</i>, 
			(WytLytPub, 1999).</html>
			</XMI.reference>
		</XMI.model>
		<XMI.metamodel xmi.name="UML" xmi.version="1.3" href="http://cgi.omg.org/cgi-bin/doc?formal/00-03-01"/>
		<XMI.metametamodel xmi.name="MOF" xmi.version="1.3" href="http://cgi.omg.org/cgi-bin/doc?formal/00-04-03"/>
	</XMI.header>
	<!--Profile Content begins here.-->
	<XMI.content>
		<UML:Package name="UML Profile for Object Role Modeling" xmi.id="orm.1" stereotype="profile">
			<UML:ModelElement.taggedValue>
				<UML:TaggedValue tag="documentation">
					<UML:TaggedValue.value>Object Role Modeling techniques produce a detailed domain model from the perspective of the business owner/customer. The typical process begins with a set of simple sentences reflecting facts about the business. The output of the process is a single model representing primarily the persistent information needs of the business. This type of model contains little, if any reference to a targeted computerized implementation. It is a model of business entities not of software classes. Through well-defined procedures, an ORM model can be transformed into a high quality object or relational schema.</UML:TaggedValue.value>
				</UML:TaggedValue>
			</UML:ModelElement.taggedValue>
			<UML:Namespace.ownedElement>
				<UML:Package name="Static Structure Stereotypes" xmi.id="orm.1.1">
					<UML:ModelElement.taggedValue>
						<UML:TaggedValue tag="documentation">
							<UML:TaggedValue.value>Stereotypes of constructs typically associated with a Static Structure (Class) Diagram.</UML:TaggedValue.value>
						</UML:TaggedValue>
					</UML:ModelElement.taggedValue>
					<UML:Namespace.ownedElement>
						<UML:Stereotype name="entityType" baseClass="Class" xmi.id="entityType">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>An object type (Class) that represents a collection of real-world objects having similar characteristics, some of which may be useful for identification. The characteristics may be inherited from a supertype. On transformation, an entity type generally maps to a Class. In an ORM model, an entity type appears as a solid ellipse.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<!-- <UML:Stereotype.icon href="" /> -->
						</UML:Stereotype>
						<UML:Stereotype name="valueType" baseClass="Class" xmi.id="valueType">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>An object type (Class) that represents a domain or a set of allowed literal values. On transformation a value type generally maps to a Class Attribute. In an ORM model, a value type appears as a dotted ellipse.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<!-- <UML:Stereotype.icon href="" /> -->
						</UML:Stereotype>
						<UML:Stereotype name="factType" baseClass="Association" xmi.id="factType">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>A fact type consists of one or more object types and predicates indicating the roles played by the object types. In an ORM model, a fact type appears as a contiguous series of a number of role rectangles equal to the number of object connections.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<UML:Stereotype.requiredTag>
								<UML:TaggedValue tag="sentence" xmi.id="factType.sentence">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation">
											<UML:TaggedValue.value>A skeletal verbalization of the primary fact sentence with a placeholder for each role.  This sentence can be derived by concatenating the text values and placeholders associated with each role.</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="tagType">
											<UML:TaggedValue.value>string</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="multiplicity">
											<UML:TaggedValue.value>0..1</UML:TaggedValue.value>
										</UML:TaggedValue>
									</UML:ModelElement.taggedValue>
								</UML:TaggedValue>
							</UML:Stereotype.requiredTag>
							<!-- <UML:Stereotype.icon href="" /> -->
						</UML:Stereotype>
						<UML:Stereotype name="derivedFactType" baseClass="Association" xmi.id="derivedFactType">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>A fact type whose instances can be derived algorithmically from instances of other fact types.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<UML:GeneralizableElement.generalization>
								<UML:Generalization parent="factType"/>
							</UML:GeneralizableElement.generalization>
							<!-- <UML:Stereotype.icon href="" /> -->
							<UML:Stereotype.requiredTag>
								<UML:TaggedValue tag="isStored" xmi.id="derivedFactType.isStored">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation">
											<UML:TaggedValue.value>An indicator of whether the derived instances of this fact type are stored. If not stored, instances are calculated at run-time.</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="tagType">
											<UML:TaggedValue.value>boolean</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="multiplicity">
											<UML:TaggedValue.value>0..1</UML:TaggedValue.value>
										</UML:TaggedValue>
									</UML:ModelElement.taggedValue>
								</UML:TaggedValue>
								<UML:TaggedValue tag="derivationRule" xmi.id="derivedFactType.derivationRule">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation">
											<UML:TaggedValue.value>The algorithm by which instances of this fact type are derived.</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="tagType">
											<UML:TaggedValue.value>string</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="multiplicity">
											<UML:TaggedValue.value>0..1</UML:TaggedValue.value>
										</UML:TaggedValue>
									</UML:ModelElement.taggedValue>
								</UML:TaggedValue>
							</UML:Stereotype.requiredTag>
						</UML:Stereotype>
						<UML:Stereotype name="unaryFactType" baseClass="Association" xmi.id="unaryFactType">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>A fact type with a single role. Indicates truth of the predicate when populated. Since UML well-formedness rules disallow an Association with only one AssociationEnd, it is necessary to represent a unary fact type as a binary fact type with a Boolean value type playing the second role. </UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<UML:GeneralizableElement.generalization>
								<UML:Generalization parent="factType"/>
							</UML:GeneralizableElement.generalization>
							<!-- <UML:Stereotype.icon href="" /> -->
						</UML:Stereotype>
						<UML:Stereotype name="ormRole" baseClass="AssociationEnd" xmi.id="ormRole">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>The predicate text assigned to a role is read in a specific order and includes a placeholder for each object type in a coherently readable sentence structure. In an ORM model, a role appears as a rectangle with a line connection to an object.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<UML:Stereotype.requiredTag>
								<UML:TaggedValue tag="textBefore" xmi.id="ormRole.textBefore">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation">
											<UML:TaggedValue.value>Text associated with a role that appears before the role's placeholder in the primary reading of the fact sentence.</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="tagType">
											<UML:TaggedValue.value>string</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="multiplicity">
											<UML:TaggedValue.value>0..1</UML:TaggedValue.value>
										</UML:TaggedValue>
									</UML:ModelElement.taggedValue>
								</UML:TaggedValue>
								<UML:TaggedValue tag="textAfter" xmi.id="ormRole.textAfter">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation">
											<UML:TaggedValue.value>Text associated with a role that appears after the role's placeholder in the primary reading of the fact sentence.</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="tagType">
											<UML:TaggedValue.value>string</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="multiplicity">
											<UML:TaggedValue.value>0..1</UML:TaggedValue.value>
										</UML:TaggedValue>
									</UML:ModelElement.taggedValue>
								</UML:TaggedValue>
								<UML:TaggedValue tag="reading" xmi.id="ormRole.reading">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation">
											<UML:TaggedValue.value>The full sentence skeleton from this role's perspective (this role is the first role in the sentence). For fact types with more than two roles, includes '..' at the position of each role.</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="tagType">
											<UML:TaggedValue.value>string</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="multiplicity">
											<UML:TaggedValue.value>0..1</UML:TaggedValue.value>
										</UML:TaggedValue>
									</UML:ModelElement.taggedValue>
								</UML:TaggedValue>
							</UML:Stereotype.requiredTag>
							<!-- <UML:Stereotype.icon href="" /> -->
						</UML:Stereotype>
						<UML:Stereotype name="nestedObjectType" baseClass="AssociationClass" xmi.id="nestedObjectType">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>A nested-facttype is an entity type that is formed from a facttype to enable the facttype itself to play roles. Generally, every role in the facttype must be constrained by a single unique constraint. In an ORM model, a nested-facttype appears as a solid ellipse surrounding the facttype.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<UML:Stereotype.requiredTag>
								<UML:TaggedValue tag="sentence" xmi.id="nestedObjectType.sentence">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation">
											<UML:TaggedValue.value>A skeletal verbalization of the primary fact sentence with a placeholder for each role.  This sentence can be derived by concatenating the text values and placeholders associated with each role.</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="tagType">
											<UML:TaggedValue.value>string</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="multiplicity">
											<UML:TaggedValue.value>0..1</UML:TaggedValue.value>
										</UML:TaggedValue>
									</UML:ModelElement.taggedValue>
								</UML:TaggedValue>
							</UML:Stereotype.requiredTag>
							<!-- <UML:Stereotype.icon href="" /> -->
						</UML:Stereotype>
						<UML:Stereotype name="referenceMode" baseClass="Attribute" xmi.id="referenceMode">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>The attribute or set of attributes that is used to uniquely identify an instance of an entity type. May be derived from associations or the object type's heritage.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<!-- <UML:Stereotype.icon href="" /> -->
						</UML:Stereotype>
						<UML:Stereotype name="valueAttribute" baseClass="Attribute" xmi.id="valueAttribute">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>The attribute that holds the value assigned to an instance of a value type.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<!-- <UML:Stereotype.icon href="" /> -->
						</UML:Stereotype>
					</UML:Namespace.ownedElement>
				</UML:Package>
				<UML:Package name="Constraint Stereotypes" xmi.id="orm.1.2">
					<UML:ModelElement.taggedValue>
						<UML:TaggedValue tag="documentation">
							<UML:TaggedValue.value>The ORM language is rich with constraint types. Constraints consistently inolve interactions among roles. This contrasts with standard UML, which focuses on constraints for classes, associations and attributes.</UML:TaggedValue.value>
						</UML:TaggedValue>
					</UML:ModelElement.taggedValue>
					<UML:Namespace.ownedElement>
						<UML:Stereotype name="ormConstraint" baseClass="Constraint" xmi.id="ormConstraint" isRoot="true">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>A general constraint exhibiting properties common to all ORM constraint types. This sterotype may be used to document constraints that do not conform to the pre-defined constraint stereotypes. Other ORM constraint stereotypes inherit from ormConstraint.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<!-- <UML:Stereotype.icon href="" /> -->
						</UML:Stereotype>
						<UML:Stereotype name="unique" baseClass="Constraint" xmi.id="unique">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>Constrains a set of roles in such a way that each instance of the set of constrained roles is distinguishable from every other instance. A unique constraint appears as a two-headed arrow spanning the constrained roles.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<UML:GeneralizableElement.generalization>
								<UML:Generalization parent="ormConstraint"/>
							</UML:GeneralizableElement.generalization>
							<!-- <UML:Stereotype.icon href="" /> -->
							<UML:Stereotype.requiredTag>
								<UML:TaggedValue tag="isPrimary" xmi.id="unique.isPrimary">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation">
											<UML:TaggedValue.value>A value of "true" indicates that a unique constraint acts as the primary identifier for the relevant entity type.</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="tagType">
											<UML:TaggedValue.value>boolean</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="multiplicity">
											<UML:TaggedValue.value>0..1</UML:TaggedValue.value>
										</UML:TaggedValue>
									</UML:ModelElement.taggedValue>
								</UML:TaggedValue>
							</UML:Stereotype.requiredTag>
						</UML:Stereotype>
						<UML:Stereotype name="mandatory" baseClass="Constraint" xmi.id="mandatory">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>Specifies that every instance of an object type's population must play the connected role. A mandatory constraint may involve more than one role, in which case each instance of the object type must play at least one of the connected roles. A mandatory constraint appears as a small, filled circle at the point where a role connector(s) touches the object type.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<UML:GeneralizableElement.generalization>
								<UML:Generalization parent="ormConstraint"/>
							</UML:GeneralizableElement.generalization>
							<!-- <UML:Stereotype.icon href="" /> -->
						</UML:Stereotype>
						<UML:Stereotype name="frequency" baseClass="Constraint" xmi.id="frequency">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>Places a restriction on the number of times a particular value, or set of values, can appear in the population of one or more roles in a given facttype. Uses standard UML constraint notation with the frequency range indicated in the constraint body.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<UML:GeneralizableElement.generalization>
								<UML:Generalization parent="ormConstraint"/>
							</UML:GeneralizableElement.generalization>
							<UML:Stereotype.requiredTag>
								<UML:TaggedValue tag="multiplicity" xmi.id="frequency.multiplicity">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation">
											<UML:TaggedValue.value>The minimum and maxinum number of instances permitted.</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="tagType">
											<UML:TaggedValue.value>multiplicityRange</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="multiplicity">
											<UML:TaggedValue.value>0..1</UML:TaggedValue.value>
										</UML:TaggedValue>
									</UML:ModelElement.taggedValue>
								</UML:TaggedValue>
							</UML:Stereotype.requiredTag>
							<!-- <UML:Stereotype.icon href="" /> -->
						</UML:Stereotype>
						<UML:Stereotype name="ring" baseClass="Constraint" xmi.id="ring">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>Constrains a pair of roles to conform to certain predefined characteristics, indicated by the semantics of the ringType. This type of constraint only applies to the roles in a binary fact type that associates an entity type with itself.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<UML:GeneralizableElement.generalization>
								<UML:Generalization parent="ormConstraint"/>
							</UML:GeneralizableElement.generalization>
							<UML:Stereotype.stereotypeConstraint>
								<UML:Constraint name="binaryFactOnly" xmi.id="ring.binaryFactOnly">
									<UML:Constraint.body>
										<UML:BooleanExpression body="Must constrain both roles of a binary fact type"/>
									</UML:Constraint.body>
								</UML:Constraint>
								<UML:Constraint name="roleHeritage" xmi.id="ring.roleHeritage">
									<UML:Constraint.body>
										<UML:BooleanExpression body="Both constrained roles must be played by object types with common heritage"/>
									</UML:Constraint.body>
								</UML:Constraint>
							</UML:Stereotype.stereotypeConstraint>
							<UML:Stereotype.requiredTag>
								<UML:TaggedValue tag="ringType" xmi.id="ring.ringType">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation">
											<UML:TaggedValue.value>The type of ring constraint.
											    </UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="tagType">
											<UML:TaggedValue.value>enum</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="multiplicity">
											<UML:TaggedValue.value>0..1</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="enumLiterals">
											<UML:TaggedValue.value>acyclic; antisymmetric; asymmetric; intransitive; irreflexive; symmetric; acyclic-intransitive; asymmetric-intransitive; intransitive-symmetric; irreflexive-symmetric</UML:TaggedValue.value>
										</UML:TaggedValue>
									</UML:ModelElement.taggedValue>
								</UML:TaggedValue>
							</UML:Stereotype.requiredTag>
							<!-- <UML:Stereotype.icon href="" /> -->
						</UML:Stereotype>
						<UML:Stereotype name="set" baseClass="Constraint" xmi.id="set">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>A set constraint expresses a data dependency among two or more ordered sets of roles.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<UML:GeneralizableElement.generalization>
								<UML:Generalization parent="ormConstraint"/>
							</UML:GeneralizableElement.generalization>
							<UML:Stereotype.stereotypeConstraint>
								<UML:Constraint name="ordered" xmi.id="set.ordered">
									<UML:Constraint.body>
										<UML:BooleanExpression body="Roles constrained are ordered by set sequence, then by role within set"/>
									</UML:Constraint.body>
								</UML:Constraint>
								<UML:Constraint name="roleHeritage" xmi.id="set.roleHeritage">
									<UML:Constraint.body>
										<UML:BooleanExpression body="Roles occupying the same position in each role set must be played by object types with common heritage"/>
									</UML:Constraint.body>
								</UML:Constraint>
								<UML:Constraint name="min2Sets" xmi.id="set.min2Sets">
									<UML:Constraint.body>
										<UML:BooleanExpression body="Constrains at least two sets of one or more roles"/>
									</UML:Constraint.body>
								</UML:Constraint>
							</UML:Stereotype.stereotypeConstraint>
							<UML:Stereotype.requiredTag>
								<UML:TaggedValue tag="setType" xmi.id="set.setType">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation">
											<UML:TaggedValue.value>The type of set constraint where 'subset' specifies that instances of one role set must be a subset of instances of a second role set; 'equality' requires that the instances of each constrained role set must be the same as the instances of each of the other constrained role sets; 'exclusion' prevents instances of any one constrained role set from appearing as instances of the other constrained role sets.</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="tagType">
											<UML:TaggedValue.value>enum</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="multiplicity">
											<UML:TaggedValue.value>0..1</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="enumLiterals">
											<UML:TaggedValue.value>equality; subset; exclusion</UML:TaggedValue.value>
										</UML:TaggedValue>
									</UML:ModelElement.taggedValue>
								</UML:TaggedValue>
								<UML:TaggedValue tag="numberOfSets" xmi.id="set.numberOfSets">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation">
											<UML:TaggedValue.value>The number of sets constrained.
											    </UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="tagType">
											<UML:TaggedValue.value>int</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="multiplicity">
											<UML:TaggedValue.value>0..1</UML:TaggedValue.value>
										</UML:TaggedValue>
									</UML:ModelElement.taggedValue>
								</UML:TaggedValue>
								<UML:TaggedValue tag="rolesPerSet" xmi.id="set.rolesPerSet">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation">
											<UML:TaggedValue.value>The number of roles in each constrained set.
											    </UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="tagType">
											<UML:TaggedValue.value>int</UML:TaggedValue.value>
										</UML:TaggedValue>
										<UML:TaggedValue tag="multiplicity">
											<UML:TaggedValue.value>0..1</UML:TaggedValue.value>
										</UML:TaggedValue>
									</UML:ModelElement.taggedValue>
								</UML:TaggedValue>
							</UML:Stereotype.requiredTag>
							<!-- <UML:Stereotype.icon href="" /> -->
						</UML:Stereotype>
					</UML:Namespace.ownedElement>
				</UML:Package>
				<UML:Package name="Instance Stereotypes" xmi.id="orm.1.3">
					<UML:ModelElement.taggedValue>
						<UML:TaggedValue tag="documentation">
							<UML:TaggedValue.value>Object Role Modeling techniques rely on concrete examples as the basis for developing a model. Examples are always populations of fact types.</UML:TaggedValue.value>
						</UML:TaggedValue>
					</UML:ModelElement.taggedValue>
					<UML:Namespace.ownedElement>
						<UML:Stereotype name="factInstance" baseClass="Link" xmi.id="factInstance">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>An example fact instance useful for
                      discussion with user-owners to validate facts and derive
                      constraints.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<!-- <UML:Stereotype.icon href="" /> -->
						</UML:Stereotype>
						<UML:Stereotype name="roleInstance" baseClass="LinkEnd" xmi.id="roleInstance">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation">
									<UML:TaggedValue.value>The value associated with a role in a fact instance.</UML:TaggedValue.value>
								</UML:TaggedValue>
							</UML:ModelElement.taggedValue>
							<!-- <UML:Stereotype.icon href="" /> -->
						</UML:Stereotype>
					</UML:Namespace.ownedElement>
				</UML:Package>
			</UML:Namespace.ownedElement>
			<UML:Package.elementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Core"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="Association"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Core"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="AssociationClass"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Core"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="AssociationEnd"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Core"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="Attribute"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Core"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="Class"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Core"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="Constraint"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Core"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="DataType"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Core"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="Dependency"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Core"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="Generalization"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Model Management"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="ElementImport"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Model Management"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="Model"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Model Management"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="Package"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Model Management"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="SubSystem"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Extension Mechanisms"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="Stereotype"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Extension Mechanisms"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="TaggedValue"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Common Behavior"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="DataValue"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Common Behavior"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="Instance"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Common Behavior"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="Link"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Common Behavior"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="LinkEnd"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Common Behavior"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="LinkObject"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
				<UML:ElementImport>
					<UML:ElementImport.package>
						<UML:Package name="Common Behavior"/>
					</UML:ElementImport.package>
					<UML:ElementImport.modelElement>
						<UML:ModelElement name="Object"/>
					</UML:ElementImport.modelElement>
				</UML:ElementImport>
			</UML:Package.elementImport>
		</UML:Package>
	</XMI.content>
</XMI>
