<Realm>
  "Shared Worldview"@en
  "Cosmovisión compartida"@es
  comment "Shared archivistic data and definitions"@en
  comment "Definiciones y datos archivísticos compartidos"@es

  abbreviation swv
  thisOntology "http://purl.org/NET/durito/ontologies/2005/09/shared-worldview#"
  dependsRealm sys

  <RepositoryArea>
    "Shared Archival Things Area"@en
    "Área para cosas archivísticas compartidas"@es
    sharedArchivalThings
  </RepositoryArea>
</Realm>

<DefinitionSet general>
    <Vocabulary>
        <Property swv:hasName>
            "Name"@en
            "Nombre"@es
            range xsd:string
      	    adjPhraseRule es "cuyo nombre contiene <searchTerm/>" tailSearchTerm            
        </Property>

        <Property swv:hasUniqueIdentifier>
            "Call Number"@en
            "Código de referencia"@es
            adjPhraseRule es "cuyo código de referencia contiene <searchTerm/>" tailSearchTerm
        </Property>

        <Property swv:hasTitle>
            "Title"@en
            "Título"@es
            # range is hardcoded as swv:Title
            # order of instantiatingg stuff impedes us from setting range here rather than in Java
            adjPhraseRule es "con el título <refTerm/>" tailReferringTerm
            adjPhraseRule es "cuyo título contiene <searchTerm/>" tailSearchTerm
            adjPhraseRule es "cuyo título" chaining M S

			# I thought we'd need this, but it seems we don't, and adding it crashes the system... Hmm..
			
            # range swv:ComplexTitle
            searchWeight 9
            
            hardcoded
        </Property>

        <AbstractDataType swv:Title>
            "Title"@en
            "Título"@es
            hardcoded
        </AbstractDataType>

        <FundamentalDataType swv:BasicTitle>
            "String Title"@en
            "Título en cadena"@es 
            subDataTypeOf swv:Title
            subDataTypeOf xsd:string
            hardcoded
        </FundamentalDataType>

        <FundamentalDataType swv:Prose>
            "Prose"@en
            "Prosa"@es 
            subDataTypeOf xsd:string
            hardcoded
            unOrderable
        </FundamentalDataType>

        <FundamentalDataType swv:DOSubstitute>
            "Describable Object Substitute"@en
            "Sustituto de objeto describible"@es
            subDataTypeOf xsd:string
            hardcoded
            unOrderable
            groupable
        </FundamentalDataType>

        <Property swv:hasDescription>
            "Description"@en
            "Descripción"@es
            adjPhraseRule es "cuya descripción contiene <searchTerm/>" tailSearchTerm
            range swv:Prose
            hardcoded
            searchWeight 8
        </Property>

        <Property swv:hasNotes>
            "Notes"@en
            "Notas"@es
            range sys:LFMarkup
        </Property>

        <Property swv:hasAbbreviation>
            "Abbreviation"@en
            "Abreviación"@es
            range xsd:string
        </Property>     
        
    </Vocabulary>

    <RuleSet thing>
        <Structure>
            <Descriptor has_name>
                property swv:hasName
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
                multilingual
            </Descriptor>
       </Structure>  
       
        <BPVFunctions>
     		<TextBPVFunction text_ref>
         		defaultTextBPVFunction
         		slot has_name captureSearchHits
         		multilingual
         			|{ 
						(@root->has_name).text_bpv
			        }|
	    	</TextBPVFunction>
	    </BPVFunctions>
       
        <Descriptions>
            VariableDesc default
            ShortDesc default
            FullDesc default
        </Descriptions>
    </RuleSet>
</DefinitionSet>

<DefinitionSet prototypical_stuff>
    <Vocabulary>
        <Property swv:isPartToWhole>
            "Is Part to Whole"@en
            "Es parte de la totalidad"@es
        </Property>
 
        <Class swv:Place>
            "Place"@en
            "Lugar"@es
            unGroupable
        </Class>   

        <Property swv:hasBroader>
            "Broader"@en
            "Más amplio"@es
        </Property>
        
    </Vocabulary>
 
 
    <RuleSet hierarchy_element>
        <Structure>

		    <Descriptor has_name>
                 useDefinition thing.has_name
	        </Descriptor>     			

            <Descriptor has_broader>
                property swv:hasBroader
                minCardinality 0
                maxCardinality 1
            </Descriptor>
        </Structure>
        
        <BPVFunctions>
     		<TextBPVFunction text_ref>
         		defaultTextBPVFunction
         		slot has_name captureSearchHits
         		multilingual
         			|{ 
						(@root->has_name).text_bpv
			        }|
	    	</TextBPVFunction>
	    </BPVFunctions>
    </RuleSet>

</DefinitionSet>

<DefinitionSet physical_things>
     <Vocabulary>
        <Class swv:Material>
            "Material"@en
            "Material"@es
        </Class>      

       <Property swv:hasMaterial>
            "Materials"@en
            "Materiales"@es
            # inverse "Material de"@es
            # inverse "Material of"@en
            domain swv:PhysicalObject
            range  swv:Material
            adjPhraseRule es "de <refTerm/>" tailReferringTerm
            adjPhraseRule es "de un material" chaining M S			 
        </Property>
        
       <Class swv:PhysicalThing>
            "Physical Thing"@en
            "Cosa física"@es
       </Class>
    
       <Class swv:PhysicalObject>
            "Physical Object"@en
            "Objeto Físico"@es
            subClassOf swv:PhysicalThing
       </Class>

        <Property swv:hasInscriptionLink>
            "Inscripción"@es
            "Inscription"@en
            subPropertyOf swv:hasManifestationLink
            range swv:ManifestationLink
        </Property>
        
        <Property swv:hasSealLink>
            "Seal"@en
            "Sello"@es
            subPropertyOf swv:hasManifestationLink
            range swv:ManifestationLink
        </Property>                

#La siguiente propiedad se usa para fotografías
#soportes primarios
        <Property swv:hasMainManifestationLink>
            "Vinculo a la manifestación principal"@es
            "Link to the main manifetation"@en
            subPropertyOf swv:hasManifestationLink
            range swv:ManifestationLink 
        </Property>
       
#       <Class swv:ComponentRole>
#              "Component Role"@en
#              "Rol del Componente"@es
#       </Class>       
       
#       <Class swv:RoleOfPhotographSupport>
#              "RoleOfPhotographSupport"@en
#              subClassOf swv:ComponentRole             
#       </Class>       
        
    </Vocabulary>
    
    <RuleSet physical_things>
        <Structure> 
                            
            <Descriptor has_manifestation_link>
              property swv:hasManifestationLink
              outRequirement fromPropRange
            </Descriptor>  
                                     
        </Structure>    
        
        #<KRRelationRules>
        #  <KRRelationRule has_linked_manifestation>
        #    has_manifestation_link->swv.manifestation_link.has_linked_manifestation
        #  </KRRelationRule>
        #</KRRelationRules>
        
     </RuleSet>
     
         
#    <RepositorySetup>
#      <SOC roles_of_photograph_supports>
#        "Roles of physical supports for photographs"@en
#        "Roles de soportes físicos de fotografías"@es
#        hasGroupDomain swv:RoleOfPhotographSupport
#        bindToRuleSet thing
#        secondaryLevel
#        <RequiredMembers>
#          rm primary
#          rm secondary
#       </RequiredMembers>
#      </SOC>
#    </RepositorySetup>
      
    
    <RuleSet physical_objects>
        <Structure>            
             <Descriptor has_material>
                  property swv:hasMaterial
                  minCardinality 1
                  outRequirement fromPropRange
             </Descriptor>
                        
#             <Descriptor has_component_link>
#                 useDefinition physical_things.has_component_link
#            </Descriptor>  
                        
#             <Descriptor has_main_component_link>
#                 useDefinition physical_things.has_main_component_link
#            </Descriptor>
            
             <Descriptor has_dimensions>
               property swv:hasDimensions
               outRequirement fromPropRange
             </Descriptor>             
        </Structure>  
        
        #<KRRelationRules>
        #  <KRRelationRule has_linked_inscriptions_or_marks>
        #    has_inscription_or_mark_link->swv.manifestation_link.has_linked_manifestation
        #  </KRRelationRule>
        #</KRRelationRules>
                    
    </RuleSet>
    
</DefinitionSet>


<DefinitionSet spatial_measurement>
    <Vocabulary>
        <AbstractDataType swv:SpatialMeasurement>
            "Spatial Measurement"@en
            "Medición Espacial"@es
            comment "Las instancias de esta clase son mediciones en el espacio físico"@es
            comment "The instances of this class are spatial mesuarements"@en
        </AbstractDataType>
        
        <ComplexDataType swv:DimensionsDescription>
            "Dimensions Description"@en
            "Descripción de las dimensiones"@es
            comment "Las instancias de esta clase son descripciones de dimensiones"@es
            comment "The instances of this class are dimensions descriptions"@en
            subDataTypeOf swv:SpatialMeasurement
            bindToRuleSet dimensions_description
            unOrderable
        </ComplexDataType>

        <FundamentalDataType swv:UnidimensionalMeasurement>
           "Medida unidimensional"@es
           subDataTypeOf xsd:float
           bindToRuleSet unidimensional_measurement
        </FundamentalDataType>

        <Property swv:hasDimensions>
            "Dimensions"@en
            "Dimensiones"@es
             domain swv:PhysicalThing 
             range swv:DimensionsDescription
             
             # the following is a terrible hack, born of our erroneous different treatment of paths before and within
             # complex values
             # Here we should be menotymizing... or merging krrrs to make a single adj phrase rule
             adjPhraseRule es "" chaining M S
       </Property>  

       <Property swv:hasHeight>
            "Height"@en
            "Altura"@es
            comment "Señala la altura"@es
            domain  swv:DimensionsDescription
    		range xsd:float
    		adjPhraseRule es "de <searchTerm/> cm de alto" tailSearchTerm
       </Property>
        
       <Property swv:hasWidth>
            "Width"@en
            "Ancho"@es
            comment "Señala el ancho"@es
            domain swv:DimensionsDescription
            range xsd:float
            
            # this is also a hack...
            adjPhraseRule es "de <searchTerm/> cm de ancho" tailSearchTerm
       </Property>
       
       <Property swv:hasLength>
            "Length"@en
            "Largo"@es
            comment "Señala el largo"@es
            domain swv:DimensionsDescription
            range xsd:float
       </Property>  

       <Class swv:MeasurementUnit>
            "Measurement Unit"@en
            "Unidad de medición"@es
             comment "Las instancias de esta clase son unidades de medición"@es
       </Class>

       <Property swv:hasMeasurementUnit>
            "Measurement Unit"@en
            "Unidad de medición"@es
            comment "Señala la unidad de medición"@es
            domain swv:SpatialMeasurement
            range swv:MeasurementUnit
       </Property>
   
    </Vocabulary>

    <RuleSet dimensions_description>
      <Structure>
          <Descriptor has_height>
            property swv:hasHeight
            maxCardinality 1
          </Descriptor>
          <Descriptor has_width>
            property swv:hasWidth
            maxCardinality 1
          </Descriptor>
          <Descriptor has_measurement_unit>
            property swv:hasMeasurementUnit
            minCardinality 1  
            maxCardinality 1
          </Descriptor>   
       </Structure>
       
      <KRRelationRules>
       <KRRelationRule measurement_unit_abbrev>
          has_measurement_unit->measurement_unit.has_abbreviation
       </KRRelationRule>
      
       <KRRelationRule measurement_unit_name>
          has_measurement_unit->measurement_unit.has_name
       </KRRelationRule>
      </KRRelationRules>
    
    <BPVFunctions>
      <TextBPVFunction text_ref>
      	 slot has_width
      	 slot has_height
      	 slot measurement_unit_abbrev
         defaultTextBPVFunction
         |{ 
           # here we are forgoing the available method .val on literals, to invoke fetched TextBPV dependency registration
           # and thus make search highlighting work...
           x = (@root->has_width).just_number
           y = (@root->has_height).just_number
           abbrev = (@root->measurement_unit_abbrev).text_bpv
           "#{x} x #{y} #{abbrev}"
         }|
      </TextBPVFunction>
    </BPVFunctions>
    
                    
#      <BPVFunctions>
#
#        <TextBPVFunction text_ref>
#          defaultTextBPVFunction
#
#           |{
#             a = Array.new 
#             a.push((ROOT->has_width).textBPV) if (ROOT->has_width).hasObject
#             a.push ((ROOT->has_height).textBPV) if (ROOT->has_height).hasObject
#             a.push ((ROOT->has_length).textBPV) if (ROOT->has_length).hasObject
#             d = a.join("x ")
#             d += (ROOT->has_measument_unit_abbr).textBPV
#           }|
#                   
#        </TextBPVFunction>
#
#      </BPVFunctions>
      
    </RuleSet>  

    <RuleSet unidimensional_measurement>
      <BPVFunctions>
        <TextBPVFunction text_ref>
           # this is an example of convoluted code that a new proposal should help us avoid
           defaultTextBPVFunction
           |{
              in_desc = @lit->dimensions_description.has_width[inv]
              in_desc = @lit->dimensions_description.has_height[inv] if (in_desc.size == 0)
              mes_unit = in_desc->dimensions_description.measurement_unit_abbrev
              "#{@lit.val} #{mes_unit.val}"
           }|
        </TextBPVFunction>
        
        <TextBPVFunction just_number>
        	resultsSearchable
           |{
              "#{@lit.val}"
           }|
        </TextBPVFunction>
      </BPVFunctions>
          
    </RuleSet>

    <RuleSet measurement_unit>
        <Structure> 
             <Descriptor has_name>
                 useDefinition thing.has_name
             </Descriptor>
             <Descriptor has_abbreviation>
                property swv:hasAbbreviation
                multilingual
             </Descriptor>
        </Structure>              
    </RuleSet>

    <RepositorySetup>
        <SOC measurement_unit>
            "Measurements units mentioned for physical things"@en
            "Unidades de medida mencionadas para las cosas físicas"@es
            hasGroupDomain swv:MeasurementUnit
            bindToRuleSet measurement_unit
            secondaryLevel
        </SOC>
    </RepositorySetup>

</DefinitionSet>


<DefinitionSet linking_groups>
    <Vocabulary>
        <Property swv:hasGroupLink>
            "Group Link"@en
            "Vínculo de grupo"@es
            range swv:GroupLink
        </Property>

        <Property swv:hasLinkedGroup>
            "Linked group"@en
            "Grupo vinculado"@es
            range sys:Group
        </Property>

        <ComplexDataType swv:GroupLink>
            "Group Link"@en
            "Vínculo de grupo"@es
            comment "A link between one group and another"@en
            comment "Un vínculo entre un grupo y otro"@es
            bindToRuleSet group_link
        </ComplexDataType>
    </Vocabulary>

    <RuleSet group_link>
        <Structure>
            <Descriptor has_linked_group>
                property swv:hasLinkedGroup
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>
        </Structure>
    </RuleSet>
</DefinitionSet>

<DefinitionSet time>
    <Vocabulary>
        <Property swv:spans>
            "Spans"@en
            "Período"@es
            range swv:CalendarPointer
			
			# yet another terrible hack            
            adjPhraseRule es "<searchTerm/>" tailSearchTerm
        </Property>

        <Property swv:starts>
            "Starts"@en
            "Inicio"@es
            range swv:CalendarPointer
            
             # the following is a terrible hack, born of our erroneous different treatment of paths before and within
             # complex values
             # Here we should be menotymizing... or merging krrrs to make a single adj phrase rule
             adjPhraseRule es "" chaining M S
        </Property>

        <Property swv:ends>
            "Ends"@en
            "Fin"@es
            range swv:CalendarPointer
             # the following is a terrible hack, born of our erroneous different treatment of paths before and within
             # complex values
             # Here we should be menotymizing... or merging krrrs to make a single adj phrase rule
             adjPhraseRule es "" chaining M S
        </Property>

        <AbstractDataType swv:TimeData>
            "Time Data"@en
            "Datos de tiempo"@es
            comment "Any data regarding time"@en
            comment "Cualquier dato acerca del tiempo"@es
        </AbstractDataType>

        <AbstractDataType swv:TimeRange>
            "Time Range"@en
            "Rango de tiempo"@es
            comment "Any period of time"@en
            comment "Cualquier período en el tiempo"@es
            subDataTypeOf swv:TimeData
            #comparisonVector Integer start_point default
        </AbstractDataType>

        <ComplexDataType swv:TimeRangeWSE>
            "Time Range with Specified Start and End Points"@en
            "Rango de tiempo con puntos inicial y final definidos"@es
            comment "A range of time with specified start and end points"@en
            comment "Un rango de tiempo con los puntos inicial y final definidos"@es
            subDataTypeOf swv:TimeRange
            bindToRuleSet time_range_wse
        </ComplexDataType>

        <ComplexDataType swv:TimeRangeOverUnit>
            "Time Range Over Unit"@en
            "Rango de tiempo por unidad"@es
            comment "A range of time defined by the beginning and end of a calendar time unit"@en
            comment "Un rango de tiempo definido por el inicio y fin de una unidad determinada del calendario"@es
            subDataTypeOf swv:TimeRange
            comparisonVector String time_unit default
            bindToRuleSet time_range_over_unit
        </ComplexDataType>

        <ComplexDataType swv:FullDate>
            "Full Date"@en
            "Fecha completa"@es
            subDataTypeOf swv:CalendarPointer
            bindToRuleSet full_date
        </ComplexDataType>

        <AbstractDataType swv:CalendarPointer>
            "Calendar Pointer"@en
            "Indicador sobre el calendario"@es
            subDataTypeOf swv:TimeData
            #comparisonVector Integer point default
        </AbstractDataType>

        <FundamentalDataType swv:YearInCommonEra>
            "Year in the Common Era"@en
            "Año en la era común"@es
            subDataTypeOf swv:CalendarPointer
            bindToRuleSet year_in_common_era
        </FundamentalDataType>

        <FundamentalDataType swv:DayOfMonth>
            "Day"@en
            "Día"@es
            bindToRuleSet day_of_month
        </FundamentalDataType>

      <Class swv:Month>           
        "Month"@en
        "Mes"@es
       </Class> 

       <Class swv:LevelOfTimePrecision>           
        "Level of time precision"@en
        "Nivel de precisión en el tiempo"@es
       </Class> 

        <Property swv:hasRelatedEventTime>
            "Related Event Time"@en
            "Momento de un evento relacionado"@es
            comment "This property exists mainly as a superproperty of other more specifically defined ones"@en
            comment "Esta propiedad funciona principalmente como superpropiedad, cuyas descendientes se definen de manera más precisa"@es
            range swv:TimeRange
        </Property>

        <Property swv:hasLevelOfTimePrecision>
          "Level of time precision"@en
          "Nivel de precisión en el tiempo"@es
          domain swv:TimeData
          range swv:LevelOfTimePrecision        
        </Property>

        <Property swv:hasYear>
          "Year"@en
          "Año"@es
          domain swv:FullDate
          range swv:YearInCommonEra
          # the following is a terrible hack, born of our erroneous different treatment of paths before and within
          # complex values
          # Here we should be menotymizing... or merging krrrs to make a single adj phrase rule
          adjPhraseRule es "<searchTerm/>" tailSearchTerm
          
        </Property>

        <Property swv:hasMonth>
          "Month"@en
          "Mes"@es
          domain swv:FullDate
          range swv:Month
        </Property>
        
        <Property swv:hasDayOfMonth>
          "Day"@en
          "Día"@es
          domain swv:FullDate
          range swv:DayOfMonth
        </Property>        
    </Vocabulary>

    <RuleSet time_range_wse>
        <Structure>
            <Descriptor starts>
                property swv:starts
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>
            <Descriptor ends>
                property swv:ends
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>
            <Descriptor has_level_of_time_precision>
                property swv:hasLevelOfTimePrecision
                minCardinality 0
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>    
        </Structure>

        #<CompVectorFunctions>
        #    <CompVectorFunction start_point>
        #        |{ (ROOT->starts).point }|
        #    </CompVectorFunction>
        #</CompVectorFunctions>

        <BPVFunctions>
            <TextBPVFunction text_ref>
            	slot starts
            	slot ends
                defaultTextBPVFunction
                |{ (@root->starts).text_bpv + " - " + (@root->ends).text_bpv }|
            </TextBPVFunction>
        </BPVFunctions>
    </RuleSet>

    <RuleSet time_range_over_unit>
        <Structure>
            <Descriptor spans>
                property swv:spans
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>
            
            <Descriptor has_level_of_time_precision>
                property swv:hasLevelOfTimePrecision
                minCardinality 0
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>    
                        
        </Structure>

       <KRRelationRules> 
         <KRRelationRule time_precision_abbrev>
           has_level_of_time_precision->level_of_time_precision.has_abbrev 
         </KRRelationRule>           
       </KRRelationRules>

        <CompVectorFunctions>
            <CompVectorFunction time_unit>
                 |{ 
                    (@root->spans).val
                 }|
            </CompVectorFunction>
       </CompVectorFunctions>      
    
        <BPVFunctions>
          <TextBPVFunction text_time_precision>
            defaultTextBPVFunction
            slot time_precision_abbrev
            slot spans captureSearchHits
            |{  
               abbrev = @root->time_precision_abbrev
               s = @root->spans
               if (abbrev.size > 0)
                  "#{abbrev.text_bpv} #{s.text_bpv}"
               else
                  "#{s.text_bpv}"   
               end
              
            }|  
          </TextBPVFunction>  
        </BPVFunctions>
    </RuleSet>

    <RuleSet year_in_common_era>
        <BPVFunctions>
            <TextBPVFunction dummy>
                |{ "nada" }|
            </TextBPVFunction>
        </BPVFunctions>
    
    
        #<CompVectorFunctions>
        #    <CompVectorFunction point>
        #        |{ Time.utc(LIT.textBPV).to_i }|
        #    </CompVectorFunction>
        #</CompVectorFunctions>
    </RuleSet>
    
    <RuleSet level_of_time_precision>
      <Structure>
      <Descriptor has_name>
        useDefinition thing.has_name
      </Descriptor>
      <Descriptor has_abbrev>
        property swv:hasAbbreviation
      </Descriptor>  
      </Structure>
    </RuleSet>
    
    <RuleSet day_of_month>    
            <BPVFunctions>
            <TextBPVFunction dummy>
                |{ "nada" }|
            </TextBPVFunction>
        </BPVFunctions>
    </RuleSet>

    <RuleSet full_date>
        <Structure>
            <Descriptor has_year>
                property swv:hasYear
                minCardinality 1
                maxCardinality 1
            </Descriptor>

            <Descriptor has_month>
                property swv:hasMonth
                minCardinality 1
                maxCardinality 1
            </Descriptor>

            <Descriptor has_day_of_month>
                property swv:hasDayOfMonth
                minCardinality 1
                maxCardinality 1
            </Descriptor>                        
        </Structure>
    
        <BPVFunctions>
          <TextBPVFunction text_ref>
            slot has_year
            slot has_month
            slot has_day_of_month
            defaultTextBPVFunction
            |{  
				year = (@root->has_year).text_bpv
				month = (@root->has_month).text_bpv
				day = (@root->has_day_of_month).text_bpv
				"#{day} de #{month} de #{year}"
            }|  
          </TextBPVFunction>  
        </BPVFunctions>
    </RuleSet>
        
    <RepositorySetup>
        <SOC levels_of_time_precision>
            "Levels of time precision"@en
            "Niveles de precisión en el tiempo"@es
            hasGroupDomain swv:LevelOfTimePrecision
            bindToRuleSet level_of_time_precision
            secondaryLevel
        </SOC>
        
        <SOC months>
            "Months"@en
            "Meses"@es
            hasGroupDomain swv:Month
            bindToRuleSet thing
            secondaryLevel
        </SOC>        
    </RepositorySetup>
</DefinitionSet>

<DefinitionSet describing_people>
    <Vocabulary>
        <Class swv:Person>
            "Person"@en
            "Persona"@es
        </Class>

        <Property swv:hasGivenNames>
            "Given Names"@en
            "Nombres"@es
            subPropertyOf swv:hasName
            range xsd:string
        </Property>

        <Property swv:hasLastNames>
            "Last Names"@en
            "Apellidos"@es
            subPropertyOf swv:hasName
            range xsd:string
        </Property>
    </Vocabulary>

    <RuleSet person>
        <Structure>
            <Descriptor has_given_names>
                property swv:hasGivenNames
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>
            <Descriptor has_last_names>
                property swv:hasLastNames
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>
        </Structure>

        <BPVFunctions>
            <TextBPVFunction full_name_fl>
                orderUsing has_last_names
                slot has_last_names captureSearchHits
                slot has_given_names captureSearchHits
                |{ (@root->has_given_names).text_bpv + " " + (@root->has_last_names).text_bpv }|
            </TextBPVFunction>
            
            <TextBPVFunction full_name_lf>
                defaultTextBPVFunction
                slot has_last_names captureSearchHits
                slot has_given_names captureSearchHits
                |{ (@root->has_last_names).text_bpv + ", " + (@root->has_given_names).text_bpv }|
            </TextBPVFunction>
        </BPVFunctions>

        <Descriptions>
            defaultOrderBy has_last_names
            VariableDesc default
            ShortDesc default
            FullDesc default
        </Descriptions>
    </RuleSet>

    <RepositorySetup>
        <SOC people>
            "People mentioned in collections in these archives"@en
            "Personas mencionadas en las colecciones de estos archivos"@es
            hasGroupDomain swv:Person
            bindToRuleSet person
            secondaryLevel
        </SOC>
    </RepositorySetup>
</DefinitionSet>

<DefinitionSet describing_institutions>
    <Vocabulary>
        <Class swv:Institution>
            "Institution"@en
            "Institución"@es
        </Class>
        
        <Property swv:curatedBy>
        	"Curated by Institution"@en
        	"Institución de resguardo"@es
        	range swv:Institution
        	adjPhraseRule es "resguardad<hgen/><hpl/> por <refTerm/>" tailReferringTerm
            adjPhraseRule es "resguardad<hgen/><hpl/> por una institución" chaining F S           
        </Property>
    </Vocabulary>
</DefinitionSet>

<DefinitionSet authorship>
    <Vocabulary>
        <Class swv:Author>
            "Author"@en
            "Autor"@es   
            subClassOf swv:Person    
        </Class>
      
        <Property swv:hasAuthor>
            "Author"@en
            "Autor"@es
            range swv:Author
            adjPhraseRule es "escrit<hgen/><hpl/> por <refTerm/>" tailReferringTerm
            adjPhraseRule es "escrit<hgen/><hpl/> por una persona" chaining F S
        </Property>                      
    </Vocabulary>
</DefinitionSet>

<DefinitionSet place>
    <Vocabulary>

        <Class swv:City>
            "City"@en
            "Ciudad"@es
            subClassOf swv:Place
        </Class>

        <Class swv:Country>
            "Country"@en
            "País"@es
            subClassOf swv:Place
        </Class>

        <Class swv:State>
          "State"@en
          "Estado"@es 
          subClassOf swv:Place  
        </Class>              
          
        <Class swv:Delegation>
          "Delegation"@en
          "Delegación"@es
           subClassOf swv:Place
        </Class>
        
        <Class swv:Municipality>
          "Municipality"@en
          "Municipio"@es
           subClassOf swv:Place
        </Class>
        
        <Class swv:Neighborhood>
          "Neighborhood"@en
          "Vecindario"@es
          subClassOf swv:Place
          unGroupable
        </Class>     

        <Class swv:Street>
           "Street"@en
           "Calle"@es
           subClassOf swv:Place
           unGroupable
        </Class>

        <Class swv:Square>
           "Square"@en
           "Plaza"@es
           subClassOf swv:Place
           unGroupable
        </Class>

        <Class swv:StreetLocation>
           "Street Location"@en
           "Ubicación de calle"@es
           subClassOf swv:Place
           unGroupable
        </Class>

          # Note: the range of the following properties is weird because of current limitations
          # in our mechanism for generating search results, as well as selection of stuff for grouping
          <Property swv:inCountry>
            "Country"@en
            "País"@es
            range swv:Place
            range swv:Country
            compactInSearch
          </Property>
          
          <Property swv:inStateOrProvince>
            "State"@en
            "Estado"@es
            range swv:Place
            range swv:State
            compactInSearch
          </Property>
 
          <Property swv:inCity>
            "City"@en
            "Ciudad"@es
            range swv:Place
            range swv:City
            compactInSearch
          </Property>
          
          <Property swv:inDelegationOrMunicipality>
            "Delegation or Municipality"@en
            "Municipio o Delegación"@es
            range swv:Place
            range swv:Delegation
            range swv:Municipality
            compactInSearch
          </Property>
          
          <Property swv:inNeighborhood>
            "Neighborhood"@en
            "Colonia o Barrio"@es
            range swv:Place
            range swv:Neighborhood
            compactInSearch
          </Property>
          
          <Property swv:hasStreetOrSquare>
            "Street or Square"@en
            "Calle o plaza"@es
            range swv:Place
            range swv:Street
            range swv:Square
            compactInSearch
          </Property>
          
          <Property swv:atStreetLocation>
            "Street Address"@en
            "Calle y número"@es
            range swv:Place
            range swv:StreetLocation
            compactInSearch
          </Property>
        
        <Property swv:hasRelatedLocation>
            "Related Location"@en
            "Ubicación relacionada"@es
            comment "This property exists mainly as a superproperty of other more specifically defined ones"@en
            comment "Esta propiedad funciona principalmente como superpropiedad, cuyas descendientes se definen de manera más precisa"@es
            range swv:Place
        </Property>
    </Vocabulary>

    <RuleSet place>
        <Structure>
            <Descriptor has_name>
                useDefinition thing.has_name
            </Descriptor>

            <Descriptor has_street_location>
               property swv:atStreetLocation
               minCardinality 0
               maxCardinality 1
               outRequirement fromPropRange               
            </Descriptor>

            <Descriptor has_street_or_square>
               property swv:hasStreetOrSquare
               minCardinality 0
               maxCardinality 1
               outRequirement fromPropRange               
            </Descriptor>
            
            <Descriptor in_neighborhood>
               property swv:inNeighborhood
               minCardinality 0
               maxCardinality 1
               outRequirement fromPropRange               
            </Descriptor>
            
            <Descriptor in_delegation_or_municipality>
               property swv:inDelegationOrMunicipality
               minCardinality 0
               maxCardinality 1
               outRequirement fromPropRange               
            </Descriptor>

            # nota: en el modelaje actual este descriptor no se utiliza                       
            <Descriptor in_city>
               property swv:inCity
               minCardinality 0
               maxCardinality 1
               outRequirement fromPropRange               
            </Descriptor>
               
            <Descriptor in_state_or_province>
              property swv:inStateOrProvince
              minCardinality 0
              maxCardinality 1
              outRequirement fromPropRange   
            </Descriptor>
            
            <Descriptor in_country>
              property swv:inCountry
               minCardinality 0
               maxCardinality 1
               outRequirement fromPropRange               
            </Descriptor>    
                        
        </Structure>

        <BPVFunctions>
            # the following is all very, very hackish, but teaches us useful lessons
            <TextBPVFunction long_name>
            	slot has_name captureSearchHits
            	slot has_street_location
            	slot in_neighborhood
            	slot in_delegation_or_municipality
            	slot in_city
            	slot in_state_or_province
            	slot in_country
            	
            	# this slot isn't actually used in the function, but we need it
            	# it can't get here by slot inheritance because our slots can't do slots from functions on the same RS
            	# slot has_street_or_square
            	
            	# missing slot for this.short_name2
                defaultTextBPVFunction
                |{
                    parts = [ 
                              @root->in_neighborhood,
                              @root->in_delegation_or_municipality,
                              @root->in_city,
                              @root->in_state_or_province,
                              @root->in_country
                            ]
                    parts.map! { |part| (part.size > 0) ? part.short_name2 : nil }
                    parts.compact!
                    parts.unshift(@root.short_name2) if ((@root->has_street_location).size > 0)
                    parts.join(", ")                     
                }|
            </TextBPVFunction>
               
            <TextBPVFunction short_name1>
            	slot has_name
            	slot has_street_location
            	slot has_street_or_square
                |{
                    name = @root->has_name
                    street_location = @root->has_street_location
                    if (street_location.size > 0)
                        street_or_square = @root->has_street_or_square
                        if (street_or_square[0] == street_location[0])
                           name.text_bpv
                        else
                          "#{street_or_square.short_name1} #{name.text_bpv}"
                        end
                    else
                        name.text_bpv
                    end
                }|
            </TextBPVFunction>
            
            <TextBPVFunction short_name2>
            	slot in_neighborhood
            	# missing slot for short_name1
                |{
                    neighborhood = @root->in_neighborhood
                    if ( (neighborhood.size > 0) &&
                         (neighborhood[0] == @root))
                      "Col. #{@root.short_name1}"
                    else
                      @root.short_name1
                    end 
                }|
            </TextBPVFunction>
        </BPVFunctions>

        <Descriptions>
            <NonDefaultDescFragments>
                <ModifyTemplate has_containing_area>
                    "Is located in"@en
                    "Se ubica en"@es
                </ModifyTemplate>
            </NonDefaultDescFragments>

            VariableDesc default
            ShortDesc default
            FullDesc default
        </Descriptions>
    </RuleSet>

    <RepositorySetup>
        <SOC places>
            "Places"@en
            "Lugares"@es
            hasGroupDomain swv:Place
            bindToRuleSet place
            secondaryLevel
        </SOC>
    </RepositorySetup>
</DefinitionSet>

<DefinitionSet content_and_manifestations>
    <Vocabulary>
	
        <Class swv:ContentLink>
            "Content Link"@en
            "Vínculo de contenido"@es
            comment "Describes how content is inscribed in a manifestation"@en
            comment "Describe cómo los contenidos se plasman en una manifestación"@es
        </Class>
 
        <Class swv:Content>
            "Content"@en
            "Contenido"@es
        </Class>

        <Class swv:Manifestation>
            "Manifestation"@en
            "Manifestación"@es
        </Class>

        <Class swv:ManifestationLink>
            "ManifestationLink"@en
            "Vínculo a manifestación"@es
        </Class>
        
        <Class swv:LocationOnObject>
            "Location On Object"@en
            "Ubicación sobre el objeto"@es
        </Class>
    
 
        <Property swv:hasLocationOnObject>
            "Location On Object"@en
            "Ubicación sobre el objeto"@es
            domain swv:ManifestationLink
            range swv:LocationOnObject
            comment "Indica la ubicación de una manifestación sobre el objeto físico"@es
        </Property>    

        
        <Property swv:hasLinkedManifestation>
            "Linked Manifestation"@en
            "Manifestación vinculada"@es
            domain swv:ManifestationLink
            range swv:Manifestation
            # esto no debe ser necesario pero lo es
            range swv:Inscription
            range swv:SealManifestation
        </Property>  
        
        <Property swv:hasManifestationLink>
            "Manifestation Link"@en
            "Vínculo a una manifestación"@es
            domain swv:PhysicalObject
            range swv:ManifestationLink
        </Property>
                                    
        <Property swv:hasLinkedContent>
            "Inscribes Content"@en
            "Plasma el contenido"@es
            # inverse "Content of"@en
            # inverse "Contenido de"@es
            range swv:Content
            
            # this shouldn't be necessary, but it is
            range swv:Seal
            range swv:Text
        </Property>

        <Property swv:hasContentLink>
            "Content Link"@en
            "Vínculo de contenido"@es
            range swv:ContentLink
        </Property>

        <Property swv:hasMainContentLink>
            "Main Content Link"@en
            "Vínculo de contenido principal"@es
            subPropertyOf swv:hasContentLink
            range swv:ContentLink
        </Property>


        <Property swv:reproducedFrom>
            "Reproduced from"@en
            "Reproducido de"@es
            domain swv:ManifestationLink
            range swv:Manifestation
        </Property>

        <ComplexDataType swv:MainContentGroupLink>
            "Main Content Group Link"@en
            "Vínculo de grupo de contenidos principales"@es
            comment "A link between a group of manifestations and the group containing their main content"@en
            comment "Un vínculo entre un grupo de manifestaciones y su contenido principal"@es
            subDataTypeOf swv:GroupLink
        </ComplexDataType>
        
        #<Property swv:hasManifestation>
        # "Manifestation"@en
        # "Manifestación"@es
        #Ojo: Puede ser que esto no se utilice
        #En la verisón anterior no especificábamos el dominio
        #domain swv:ManifestationLink
        #range swv:Manifestation
        #</Property>
       
       #Parece que esto tampoco se usa 
        #<Property swv:hasMainManifestation>
         # "Main Manifestation"@en
         # "Manifestación principal"@es
         # subPropertyOf swv:hasManifestation
        #</Property>
          
    </Vocabulary>

   <RuleSet manifestation_link>
     <Structure>
       <Descriptor has_linked_manifestation>
               property swv:hasLinkedManifestation
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
        </Descriptor>
        
         <Descriptor has_location_on_object>
               property swv:hasLocationOnObject
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
        </Descriptor>
       <Descriptor reproduced_from>
                property swv:reproducedFrom
                minCardinality 0
                maxCardinality 1
                outRequirement fromPropRange
       </Descriptor>
      </Structure>
      
        <BPVFunctions>
            <TextBPVFunction full_name_lf>
                defaultTextBPVFunction
                slot has_linked_manifestation
                |{ (@root->has_linked_manifestation).text_bpv }|
            </TextBPVFunction>
        </BPVFunctions>      
   </RuleSet>

    <RuleSet content_link>
        <Structure>
            <Descriptor has_linked_content>
                property swv:hasLinkedContent
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>
            <Descriptor reproduced_from>
                property swv:reproducedFrom
                minCardinality 0
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>
        </Structure>

        #<KRRelationRules>
        #    <KRRelationRule has_linked_manifestation>
        #        manifestation.has_content_link[inv]
        #        <StructRules>
        #            minCardinality 1
        #            maxCardinality 1
        #        </StructRules>
        #    </KRRelationRule>
        #</KRRelationRules>

        <BPVFunctions>
            <TextBPVFunction text_ref>
                defaultTextBPVFunction
                slot has_linked_content
                |{
					(@root->has_linked_content).text_bpv
                }|
            </TextBPVFunction>
        </BPVFunctions>

        <Descriptions>
            VariableDesc default
            ShortDesc default
            FullDesc default
        </Descriptions>
    </RuleSet>


    <RuleSet manifestation>
        <Structure>
            <Descriptor has_content_link>
                property swv:hasContentLink
                minCardinality 0
                outRequirement fromPropRange
                multipleOrdered
            </Descriptor>
            <Descriptor has_main_content_link>
                property swv:hasMainContentLink
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>
        </Structure>

#        <KRRelationRules>
#            <KRRelationRule has_location_on_object>
#                manifestation_link.has_linked_manifestation[inv]->manifestation_link.has_location_on_object
#            </KRRelationRule>
#            
#            <KRRelationRule has_main_content>
#              has_main_content_link->content_link.has_linked_content
#            </KRRelationRule>
#        </KRRelationRules>
    </RuleSet>


    <RuleSet inscription>
       <Structure>
            <Descriptor has_main_content_link>
                useDefinition manifestation.has_main_content_link
            </Descriptor>
        </Structure>
    
        <KRRelationRules>
            <KRRelationRule has_location_on_object>
                manifestation_link.has_linked_manifestation[inv]->manifestation_link.has_location_on_object
            </KRRelationRule>
            
            <KRRelationRule has_main_content>
              has_main_content_link->content_link.has_linked_content
            </KRRelationRule>
        </KRRelationRules>
            
        <BPVFunctions>
          <TextBPVFunction ref>
            slot has_main_content
            slot has_location_on_object
            defaultTextBPVFunction
            |{
              main_content = @root->has_main_content
              location_on_obj = @root->has_location_on_object
              "\"#{main_content.text_bpv}\" <span class='note'>(#{location_on_obj.text_bpv.downcase})</span>"
            }|
          </TextBPVFunction>
        </BPVFunctions>
    </RuleSet>


#    <RuleSet content>
#        <KRRelationRules>
#            <KRRelationRule has_system_accessible_digital_copy>
#                content_link.has_linked_content[inv]->content_link.has_linked_manifestation
#                <Conditions>
#                    |{ (@out.classes).includes(sys:ComputerFile) }|
#                    |{ (@out->sys.files.has_system_accessible_uri).size > 0 }|
#                </Conditions>
#            </KRRelationRule>
#        </KRRelationRules>
#    </RuleSet>

    <RuleSet manifestation_group>
        <Structure>
            <Descriptor has_main_content_group_link>
                property swv:hasGroupLink
                minCardinality 0
                minCardinality 1
                outDataType swv:MainContentGroupLink
            </Descriptor>
        </Structure>

#        <KRRelationRules>
#            <KRRelationRule has_main_content_group>
#                has_main_content_group_link->group_link.has_linked_group
#            </KRRelationRule>
#        </KRRelationRules>
    </RuleSet>
</DefinitionSet>


<DefinitionSet conservation>
    <Vocabulary>
        <Class swv:ConservationStatus>
            "Conservation Status"@en
            "Estado de conservacion"@es
        </Class>

        <Property swv:hasConservationStatus>
            "Conservation Status"@en
            "Estado de conservacion"@es
            range swv:Prose
        </Property>
    </Vocabulary>

    <RepositorySetup>
        <SOC conservation_statuses>
            "Conservation Statuses"@en 
            "Estados de conservación"@es
            hasGroupDomain swv:ConservationStatus
            bindToRuleSet thing
            secondaryLevel
        </SOC>
    </RepositorySetup>
</DefinitionSet>

<DefinitionSet topic_classification>
    <Vocabulary>
        <Class swv:Topic>
            "Topic"@en
            "Tema"@es
        </Class>

        <Property swv:hasTopic>
            "Topic"@en
            "Tema"@es
            range swv:Topic
        </Property>
    </Vocabulary>

    <RepositorySetup>
        <SOC topics>
            "Topics"@en 
            "Temas"@es
            hasGroupDomain swv:Topic
            bindToRuleSet thing
            secondaryLevel
        </SOC>
    </RepositorySetup>
</DefinitionSet>

<DefinitionSet text>
  <Vocabulary>
      <Class swv:Text>
         "Text"@en
         "Texto"@es
         subClassOf swv:Content
      </Class>
      
      <Class swv:Inscription>
         "Inscription"@en
         "Inscripción"@es
         subClassOf swv:Manifestation
         unGroupable
      </Class>
      
      <Class swv:HandWrittenNote>
        "Handwritten Note"@en
        "Anotación manuscrita"@es
        subClassOf swv:Inscription
      </Class>      
            
      <Property swv:hasStringRepresentation>
           "String Representation"@en
           "Representación como cadena de caracteres"@es
           domain swv:Text
           range xsd:string
		   adjPhraseRule es "que contiene <searchTerm/>" tailSearchTerm
       </Property>      
                                                                       
  </Vocabulary>

  <RuleSet text>
      <Structure>
          <Descriptor has_string_representation>
                property swv:hasStringRepresentation
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
                multilingual
            </Descriptor>
       </Structure>  
        <Descriptions>
            VariableDesc default
            ShortDesc default
            FullDesc default
        </Descriptions>
        
        <BPVFunctions>
     		<TextBPVFunction text_ref>
     			slot has_string_representation captureSearchHits
         		defaultTextBPVFunction
         			|{ 
         			   (@root->has_string_representation).text_bpv
         			}|
        	</TextBPVFunction>
		</BPVFunctions>        	
        
  </RuleSet> 
</DefinitionSet>

<DefinitionSet publication>
	<Vocabulary>
		<Class swv:Publication>
        	"Publication"@en
        	"Publicacion"@es
        	subClassOf swv:Content
		</Class>          
	
	   	<Class swv:ContentComponentLink>
	    	"Vínculo a un componente de contenido"@es
	   	 	"Link to Content Component"@en
	   	</Class>		

		<Class swv:Publisher>
			"Publisher"@en
			"Editorial"@es
	    </Class>

       <FundamentalDataType swv:LocationInPublication>
			"Ubicación en la publicación"@es
			"Location in Publication"@en
			subDataTypeOf xsd:string	
			bindToRuleSet sys.xsd_string
		</FundamentalDataType>

        <Property swv:hasResearchAuthor>
            "Researcher"@en
            "Investigador"@es
             adjPhraseRule es "que presenta una investigación realizada por <refTerm/>" tailReferringTerm
             adjPhraseRule es "que presenta una investigación realizada por una persona" chaining F S
            subPropertyOf swv:hasAuthor
            range swv:Author
        </Property>
                
		<Property swv:hasContentComponentLink>
			"ContentComponent"@en
			"Componente de contenido"@es
			range swv:ContentComponentLink
		</Property>	

		# this property is a temporary hack, since
		# ranges and soc domains don't take into account
		# class hierarchies (though they should have)
		<Property swv:hasLinkedPublication>
			"Linked Publication"@en
			"Publicación vinculada"@es
			range swv:Publication
		</Property>	

		<Property swv:hasLinkedContentComponent>
			"Componente de contenido"@es
			"Content Component"@en
			range swv:Content
    	</Property>			
	
    	<Property swv:hasPublicationDate>
           "Publication date"@en
           "Fecha de publicación"@es
           subPropertyOf swv:hasRelatedEventTime
           # this may be a range or a calendar pointer; think of the different meaning of the publication date for a newspaper or a book
           range swv:TimeData

	       # this shouldn't be necessary, but for now it is
	       range swv:TimeRangeOverUnit
	       range swv:TimeRangeWSE

           # messing with chaining consistency here, but we know it'll work
           # rules for tail are irrelevant
           adjPhraseRule es "editad<hgen/><hpl/> en" chaining M S             
      	</Property>      
	        
      	<Property swv:hasLocationInPublication>
			"Ubicación en la publicación"@es
			"Location in Publication"@en
			domain swv:ContentComponentLink
            range swv:LocationInPublication
            # adjPhraseRule es "en <refTerm/>" tailReferringTerm
            adjPhraseRule es "en una ubicación que contiene <searchTerm/>" tailSearchTerm
      	</Property>

		<Property swv:hasPublisher>
			"Publisher"@en
			"Editorial"@es
			domain swv:Publication
			range swv:Publisher
            adjPhraseRule es "editad<hgen/><hpl/> por <refTerm/>" tailReferringTerm
            adjPhraseRule es "editad<hgen/><hpl/> por una casa editorial" chaining F S			
		</Property>

		<Property swv:hasPlaceOfPublication>
			"Place of Publication"@en
			"Lugar de publicación"@es
			domain swv:Publication
			range swv:Place
            adjPhraseRule es "editad<hgen/><hpl/> en <refTerm/>" tailReferringTerm
            adjPhraseRule es "editad<hgen/><hpl/> en un lugar" chaining F S			
		</Property>	

		#<Property swv:hasVolumeInformation>
		#	"Volume"@en
		#	"Volumen"@es
		#	domain swv:Publication
		#	range xsd:string
		#</Property>	

	</Vocabulary>
 
    <RuleSet publication>
        <Structure>        
            <Descriptor has_author>
                property swv:hasAuthor
                outRequirement fromPropRange
            </Descriptor>            

            <Descriptor has_research_author>
                property swv:hasResearchAuthor
                outRequirement fromPropRange
            </Descriptor>        
            
            <Descriptor has_title>
                property swv:hasTitle
                minCardinality 1
                outRequirement fromPropRange
            </Descriptor>
 
            #<Descriptor has_volume_information>
            #    property swv:hasVolumeInformation
            #    maxCardinality 1
            #    outRequirement fromPropRange
            #</Descriptor>
 
            <Descriptor has_publication_date>
            	property swv:hasPublicationDate
            	minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>
            
            <Descriptor has_publisher>
            	property swv:hasPublisher
            	outRequirement fromPropRange
            </Descriptor>
            
            <Descriptor has_place_of_publication>
            	property swv:hasPlaceOfPublication
            	minCardinality 1
            	maxCardinality 1
            	outRequirement fromPropRange
            </Descriptor>	
            
            <Descriptor has_content_component_link>
            	property swv:hasContentComponentLink
            	minCardinality 1
            	outRequirement fromPropRange            
        	</Descriptor>
        </Structure> 

        <BPVFunctions>
     		<TextBPVFunction text_ref>
     			slot has_title captureSearchHits
     			slot has_author
     			slot has_research_author
     			slot has_place_of_publication
     			slot has_publisher
     			slot has_publication_date
         		defaultTextBPVFunction
         			|{ 
						ref = ""
						
						# authors
						authors = @root->has_author
						0.upto(authors.size - 1) do |i|
							if (i == 0)
								ref << authors[i].full_name_lf
							else
								if (i < authors.size - 1)
									ref << ", #{authors[i].full_name_fl}"
								else
									ref << " y #{authors[i].full_name_fl}"
								end
							end
							ref << ". " if (i == authors.size - 1)
						end
						
						# the following is a hack for a single object with a "research author"
						research_authors = @root->has_research_author
						if (research_authors.size == 1)
							ref << "#{research_authors.full_name_lf} (investigación). "
						end
						
						# title
						title = @root->has_title
						ref << "<span class='em'>#{title.text_bpv}</span>, "
						
						# volume
						# volume = @root->has_volume_information
						# ref << "#{volume.text_bpv}, " if (volume.size > 0)
						
						# place of pub
						place = @root->has_place_of_publication
						ref << "#{place.text_bpv}, " if (place.size > 0)
						
						# publishers
						publishers = @root->has_publisher
						if (publishers.size > 0)
							publishers_array = Array.new
							publishers.each { |publisher| publishers_array << publisher.text_bpv }
							ref << "#{publishers_array.join('/')}, "
						end
						
						# date
						date = @root->has_publication_date
						ref << "#{date.text_bpv}"
						
						ref
			        }|
	    	</TextBPVFunction>
	    </BPVFunctions>
        
    </RuleSet>        
  
  	<RuleSet content_component_link>
  		<Structure>
  			<Descriptor has_location_in_publication>
  				property swv:hasLocationInPublication
  				minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
  			</Descriptor>
  			
  			<Descriptor has_linked_content_component>
  				property swv:hasLinkedContentComponent
  				minCardinality 1
  				outRequirement fromPropRange
  			</Descriptor>
  			
  			<Descriptor has_linked_publication>
  				property swv:hasLinkedPublication
  				minCardinality 1
  				outRequirement fromPropRange
  			</Descriptor>  			
  		</Structure>
  		
        <BPVFunctions>
     		<TextBPVFunction pub_and_loc>
     		    slot has_linked_publication
     		    slot has_location_in_publication
         		defaultTextBPVFunction
         			|{ 
						for_pub = @root->has_linked_publication
						for_pub_text = for_pub.size > 0 ? for_pub.text_bpv : ""
						loc = @root->has_location_in_publication
						loc_text = loc.size > 0 ? ", #{loc.text_bpv}" : ""
						"#{for_pub_text}#{loc_text}."

			        }|
	    	</TextBPVFunction>
	    </BPVFunctions>  		
  		 	
  	</RuleSet>
 
</DefinitionSet>
  
<DefinitionSet symbol>
  <Vocabulary>
    <Class swv:Symbol>
      "Symbol"@en
      "Símbolo"@es
       subClassOf swv:Content
    </Class>
    
    <Class swv:Seal>
      "Seal"@en
      "Sello"@es
       subClassOf swv:Content
       comment "Las instancias de esta clase son sellos"@es
       comment "The instances of this class are seals"@en
    </Class>
    
    <Class swv:SealManifestation>
      "Manifestation of a seal"@en
      "Manifestación de un sello"@es
      subClassOf swv:Manifestation
    </Class>  
    
  </Vocabulary>

    <RuleSet seal_manifestation>
       <Structure>
            <Descriptor has_main_content_link>
                useDefinition manifestation.has_main_content_link
            </Descriptor>
            <Descriptor has_description>
              property swv:hasDescription
              outRequirement fromPropRange
            </Descriptor>
            
        </Structure>
    
        <KRRelationRules>
            <KRRelationRule has_location_on_object>
                manifestation_link.has_linked_manifestation[inv]->manifestation_link.has_location_on_object
            </KRRelationRule>
            
            <KRRelationRule has_main_content>
              has_main_content_link->content_link.has_linked_content
            </KRRelationRule>
        </KRRelationRules>
            
        <BPVFunctions>
          <TextBPVFunction ref>
            slot has_description
            slot has_main_content
            slot has_location_on_object
            defaultTextBPVFunction
            |{
              d = @root->has_description  
              main_content = @root->has_main_content
              location_on_obj = @root->has_location_on_object
              "#{d.text_bpv} / #{main_content.text_bpv} <span class='note'>(#{location_on_obj.text_bpv.downcase})</span>"
            }|
          </TextBPVFunction>
        </BPVFunctions>
    </RuleSet>

<RuleSet seal>
      <Structure>
          <Descriptor has_string_representation>
            useDefinition text.has_string_representation
          </Descriptor>
          
          <Descriptor has_description>
              property swv:hasDescription
              outRequirement fromPropRange
          </Descriptor>
       </Structure>  
                      
        <BPVFunctions>
          <TextBPVFunction ref>
            slot has_description
            slot has_string_representation
            defaultTextBPVFunction
            |{
              # note: no provisions made for having both a string rep and a description
              d = @root->has_description
              if (d.size > 0)
                "#{d.text_bpv}"
              else
                str_rep = @root->has_string_representation
                "\"#{str_rep.text_bpv}\""
              end
            }|
          </TextBPVFunction>
        </BPVFunctions>
                  
</RuleSet>
</DefinitionSet>    

 <DefinitionSet image>
  <Vocabulary>
    <Class swv:Image>
      "Image"@en
      "Imágen"@es
      subClassOf swv:Content
    </Class>   
  </Vocabulary>
 </DefinitionSet>
       
<DefinitionSet photograph>
    <Vocabulary>
        <Class swv:Photograph>   
            "Photograph"@en
            "Foto"@es
            subClassOf swv:PhysicalObject
            comment "This class is the whole physical object that we understand as a photograph includes"@en
            comment "Esta clase comprende a la fotografía con sus soportes como un solo objeto físico"@es
        </Class>
      
        <Class swv:PhotographManifestation>
          "Photograph Manifestation"@en
          "Manifestación fotográfica"@es
          subClassOf swv:Manifestation
          comment "This class represents a specific manifestation of a photograph"@en
          comment "Esta clase representa una manifestación específica de una fotografía"@es        
        </Class>
        
        <Class swv:PhotographicPrint>
          "Photographic Print"@en
          "Fotografía"@es
          gender es F
        </Class>  
        
        <Class swv:RoleInPhotographicProcess>
        	# fix class name
            "Role In Photographic Process"@en
            "Rol en el preceso fotográfico"@es
        </Class>

        <Class swv:ToneAndColor>
            "Tone and Color"@en
            "Tono y color"@es
        </Class>
         
        <Class swv:ImageSupport>
          "Image Support"@en
          "Soporte para imágen"@es
          subClassOf swv:PhysicalObject
          comment "Clase genérica para los soporte de las imágenes"@es
          comment "Generic class for the image supports"@en
        </Class>
            
        <Class swv:PhotographSupport>
          "Photograph Support"@en
          "Soporte Fotográfico"@es 
          subClassOf swv:ImageSupport   
        </Class> 
           
        <Class swv:ImageMaterial>
            "Image Material"@en
            "Material"@es
            subClassOf swv:Material
        </Class>

        <Class swv:ImageSupportMaterial>
             "Image Support Material"@en
             "Material del soporte de la imágen"@es
             subClassOf swv:Material
        </Class>             

        <Class swv:Format>
              "Format according to size of the photographic print"@en
              "Formato según el tamaño de la impresión fotográfica"@es
        </Class>                  

        <Property swv:hasPrimarySupport>
              "Soporte principal"@es
              range swv:PhotographSupport
              adjPhraseRule es "con soporte primario" chaining M S
        </Property>

        <Property swv:hasSecondarySupport>
              "Soporte secundario"@es
              range swv:PhotographSupport
              adjPhraseRule es "con soporte secundario" chaining M S
        </Property>
    
        <Property swv:hasPhotographer>
            "Photographer"@en
            "Fotógrafo"@es
            adjPhraseRule es "tomad<hgen/><hpl/> por <refTerm/>" tailReferringTerm
            adjPhraseRule es "tomad<hgen/><hpl/> por una persona" chaining F S
			searchWeight 8
            subPropertyOf swv:hasAuthor
            range swv:Author
        </Property>

        <Property swv:hasEditor>
            "Editor"@en
            "Editor"@es
            adjPhraseRule es "editad<hgen/><hpl/> por <refTerm/>" tailReferringTerm
            adjPhraseRule es "editad<hgen/><hpl/> por una persona" chaining F S
            subPropertyOf swv:hasAuthor            
            range swv:Author
            searchWeight 8
            comment "Person or organization who is the creator of the photographic print  not necessarily the photographer"@en
        </Property>

        <Property swv:hasInitialPhotoLocation>
            "Initial Photo Location"@en
            "Ubicación de la fotografía original"@es
            subPropertyOf swv:hasRelatedLocation
            range swv:Place
            adjPhraseRule es "tomad<hgen/><hpl/> en <refTerm/>" tailReferringTerm
            adjPhraseRule es "tomad<hgen/><hpl/> en un lugar" chaining M S
            #range swv:GeographicArea
            searchWeight 7
        </Property>

        <Property swv:takenFrom>
            "Photograph taken from"@en
            "Fotografía tomada desde"@es
            # adjPhraseRule es "tomad<hgen/><hpl/> desde <refTerm/>" tailReferringTerm
            adjPhraseRule es "tomad<hgen/><hpl/> desde un lugar cuya descripción contiene <searchTerm/>" tailSearchTerm
            range swv:Prose
            searchWeight 3
        </Property>

        <Property swv:takenFacing>
            "Photograph taken Facing"@en
            "Fotografía tomada hacia"@es
            # adjPhraseRule es "tomad<hgen/><hpl/> hacia <refTerm/>" tailReferringTerm
            adjPhraseRule es "tomad<hgen/><hpl/> hacia un lugar cuya descripción contiene <searchTerm/>" tailSearchTerm
            range swv:Prose
            searchWeight 3
        </Property>

        <Property swv:hasInitialPhotoDate>
            "Initial Photo Date"@en
            "Fecha de la fotografía original"@es
            subPropertyOf swv:hasRelatedEventTime
            range swv:TimeRange
            
            # the following should not be necessary, but it is
            range swv:TimeRangeOverUnit
            range swv:TimeRangeWSE
            
            # messing with chaining consistency here, but we know it'll work
            # rules for tail are irrelevant
            adjPhraseRule es "tomad<hgen/><hpl/> en" chaining M S
            
            searchWeight 7
        </Property>

        <Property swv:hasRoleInPhotographicProcess>
        	# fix prop name
            "Role In Photographic Process"@en
            "Rol en el proceso fotográfico"@es
            # inverse "Tipo de objeto"@es
             domain swv:Photograph
             range swv:RoleInPhotographicProcess   
        </Property>

        <Property swv:hasToneAndColor>
            "Tone and Color"@en
            "Tono y color"@es
            # inverse "Tono y color de"@es
            # inverse "Tone and color of"@en
             domain swv:Photograph 
             range swv:ToneAndColor   
        </Property>
    
        <Property swv:hasFormat>
            "Format"@en
            "Formato"@es
             domain swv:Photograph 
             range swv:Format
        </Property>
        
        # properties for associated documents

        <Property swv:producedFromSameNegative>
           "Produced from the same negative"@en
           "Fotografía producida a partir del mismo negativo"@es
           range swv:PhotographicPrint
           # some more unpleasant hackishness here
           adjPhraseRule es "producid<hgen/><hpl/> a partir del mismo negativo que <refTerm/>" tailReferringTerm
           adjPhraseRule es "producid<hgen/><hpl/> a partir del mismo negativo que fotografía<hpl/>" chaining F P
           searchWeight 2
        </Property>
        
        <Property swv:isReproductionOf>
           "Reproduction of"@en
           "Reproducida de esta imagen"@es
           range swv:PhotographicPrint
           # some more unpleasant hackishness here
           adjPhraseRule es "reproducid<hgen/><hpl/> de <refTerm/>" tailReferringTerm
           adjPhraseRule es "reproducid<hgen/><hpl/> de fotografía<hpl/>" chaining F P
           searchWeight 2
        </Property>
        
        <Property swv:isInTheSameSeries>
           "Is in the Same Series"@en
           "Fotografía que pertenece a la misma serie"@es
           range swv:PhotographicPrint
           # some more unpleasant hackishness here
           adjPhraseRule es "de la misma serie que <refTerm/>" tailReferringTerm
           adjPhraseRule es "de la misma serie que fotografía<hpl/>" chaining F P
           searchWeight 2
        </Property>
        
        <Property swv:hasTheSameComposition>
           "Has the Same Composition"@en
           "Fotografía con la misma composición"@es
           range swv:PhotographicPrint
           # some more unpleasant hackishness here
           adjPhraseRule es "con la misma composición que <refTerm/>" tailReferringTerm
           adjPhraseRule es "con la misma composición que fotografía<hpl/>" chaining F P
           searchWeight 2
        </Property>
        
        <Property swv:otherRelatedObjects>
           "Objeto de otro tipo donde aparece esta imagen"@es
           "Other related objects"@en
           range swv:ContentComponentLink
           # here adj phrases are taken care of with a broader krrr
           # only used for hits on locations in publications
          adjPhraseRule es "que aparece<hvpl/> en <refTerm/>" tailReferringTerm
          adjPhraseRule es "que aparece<hvpl/> en una obra," chaining F S
          searchWeight 2
        </Property>
        
        <Property swv:sameShotDifferentCamera>
           "Same Shot from a Different Camera"@en
           "Fotografía de la misma serie, tomada con una cámara de distinto formato"@es
           range swv:PhotographicPrint
           # some more unpleasant hackishness here
           adjPhraseRule es "de la misma serie (tomad<hgen/><hpl/> con una cámara de distinto formato) que <refTerm/>" tailReferringTerm
           adjPhraseRule es "de la misma serie (tomad<hgen/><hpl/> con una cámara de distinto formato) que fotografía<hpl/>" chaining F P
           searchWeight 2
        </Property>
        
        <Property swv:publicationNote>
          "Publication Note"@en
          "Fotografía publicada en"@es
          # inverse "Obra que publica"@es
          range swv:ContentComponentLink
		  # here adj phrases are mainly taken care of with a broader krrr
		  # the following adj phrase rule is only for hits on locations in publications
          adjPhraseRule es "que aparece<hvpl/> en <refTerm/>" tailReferringTerm
          adjPhraseRule es "que aparece<hvpl/> en una obra," chaining F S
          searchWeight 2
        </Property>
    </Vocabulary>
    <RuleSet photograph>
        <Structure>
            <Descriptor has_role_in_photographic_process>
                property swv:hasRoleInPhotographicProcess
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>
       </Structure>
    </RuleSet>
    
    
    <RepositorySetup>
           <SOC roles_in_photographic_process>
                "Roles On Photographic Process"@en 
                "Roles en el proceso fotográfico"@es
                hasGroupDomain swv:RoleInPhotographicProcess
                bindToRuleSet thing
                secondaryLevel
            </SOC>
 
            <SOC tones_and_colors>
                "Tonos y colores"@en 
                "Tones and colors"@es
                hasGroupDomain swv:ToneAndColor
                bindToRuleSet hierarchy_element
                secondaryLevel
            </SOC>
            

            <SOC image_materials>
                "Image materials"@en 
                "Materiales de imágenes"@es
                hasGroupDomain swv:ImageMaterial
                bindToRuleSet thing
                secondaryLevel
            </SOC>
            
            <SOC image_support_materials>
                "Images Support Materials"@en 
                "Materiales de soportes de imágenes"@es
                hasGroupDomain swv:ImageSupportMaterial
                bindToRuleSet thing
                secondaryLevel
            </SOC>
            
                
            <SOC image_formats>
                 "Formats for photographic images"@en 
                 "Formatos para imágenes fotográficas"@es
                 hasGroupDomain swv:Format
                 bindToRuleSet thing
                 secondaryLevel
            </SOC>         
                         
     </RepositorySetup>
</DefinitionSet>

<DefinitionSet describing_exhibitions>
    <Vocabulary>
        <Property swv:hasExhibition>
          "Exhibition"@en
          "Exposición pública de la fotografía"@es
          range swv:Exhibition
          
          adjPhraseRule es "expuest<hgen/><hpl/> públicamente en <refTerm/>" tailReferringTerm
          
          # hackish violation of gramatical coherence of chaining phrases
          adjPhraseRule es "expuest<hgen/><hpl/> públicamente" chaining M S

          searchWeight 2
        </Property>
        
        <Class swv:Exhibition>
          "Exhibition"@en
          "Exhibición"@es
        </Class>

        <Property swv:hasVenue>
            "Venue"@en
            "Recinto"@es
            range swv:Venue
            adjPhraseRule es "en <refTerm/>" tailReferringTerm
            adjPhraseRule es "en una sala" chaining F S
        </Property>
        
        <Class swv:Venue>
          "Recinto"@es
          "Venue"@en
          subClassOf swv:Place
          unGroupable
        </Class>

        <Property swv:hasVenueLocation>
            "Venue Location"@en
            "Ubicación del recinto"@es
            subPropertyOf swv:hasRelatedLocation
            range swv:Place
            adjPhraseRule es "ubicad<hgen/><hpl/> en <refTerm/>" tailReferringTerm
            adjPhraseRule es "ubicad<hgen/><hpl/> en un lugar" chaining M S
        </Property>
        
        <Property swv:hasExhibitionDate>
        	"Fecha de exhibición"@es
        	subPropertyOf swv:hasRelatedEventTime
        	range swv:TimeRange
        	
        	# the following shouldn't be necessary, but it is
        	range swv:TimeRangeOverUnit
        	range swv:TimeRangeWSE
        	
            # messing with chaining consistency here, but we know it'll work
            # rules for tail are irrelevant
            adjPhraseRule es "en" chaining M S        	
        </Property>
        
    </Vocabulary>
    
    <RuleSet exhibition>
        <Structure>
            <Descriptor has_title>
                property swv:hasTitle
            </Descriptor>
            
            <Descriptor has_venue>
            	property swv:hasVenue
            </Descriptor>
            
            <Descriptor has_exhibition_date>
            	property swv:hasExhibitionDate
            </Descriptor>
            
        </Structure>
        
        <BPVFunctions>
            <TextBPVFunction full_ref>
                defaultTextBPVFunction
                slot has_title captureSearchHits
                slot has_venue
                slot has_exhibition_date
                |{
                	title = (@root->has_title).text_bpv
                	venue = (@root->has_venue).text_bpv
                	date = (@root->has_exhibition_date).text_bpv                	
                	"\"#{title}\", en #{venue}, #{date}."
                }|
            </TextBPVFunction>
        </BPVFunctions>
	</RuleSet>


    <RuleSet venue>
        <Structure>
            <Descriptor has_name>
                useDefinition thing.has_name
            </Descriptor>
            
            <Descriptor has_venue_location>
            	property swv:hasVenueLocation
            </Descriptor>
        </Structure>
        
        <BPVFunctions>
            <TextBPVFunction full_ref>
                defaultTextBPVFunction
                slot has_name captureSearchHits
                slot has_venue_location
                |{
                	name = (@root->has_name).text_bpv
                	loc = (@root->has_venue_location).text_bpv
                	"#{name}, #{loc}"
                }|
            </TextBPVFunction>
        </BPVFunctions>
	</RuleSet> 
</DefinitionSet>

<DefinitionSet catalographic_titles>
    <Vocabulary>
        <Property swv:hasComplexTitle>
        	# for the time being we'll be using just the hasTitle property in current collections
        
            "Title"@en
            "Título"@es           
            adjPhraseRule es "con el título <refTerm/>" tailReferringTerm
            adjPhraseRule es "cuyo título contiene <searchTerm/>" tailSearchTerm            
            # violation of uniform gramatic structures for chaining adj phrases
            # but we know it'll work
            adjPhraseRule es "cuyo título" chaining M S
            subPropertyOf swv:hasTitle
            range swv:ComplexTitle
            searchWeight 9
        </Property>
    
        <ComplexDataType swv:ComplexTitle>
            "Complex Title"@en
            "Título complejo"@es
            subDataTypeOf swv:Title
            comparisonVector String title_text default
            bindToRuleSet complex_title
        </ComplexDataType>

        <Property swv:wasTakenFrom>
            "Was Taken From"@en
            "Fué tomado de"@es
             domain swv:ComplexTitle
             range swv:HandWrittenNote
             range swv:Publication
        </Property>

        <Property swv:hasTitleText>
            "Title Text"@en
            "Texto del título"@es
            
            # violation of uniform gramatic structures for chaining adj phrases
            # but we know it'll work
 		    adjPhraseRule es "contiene <searchTerm/>" tailSearchTerm            
            domain swv:ComplexTitle
            range xsd:string
        </Property>
    </Vocabulary>

    <RuleSet complex_title>
        <Structure>
            <Descriptor was_taken_from>
                property swv:wasTakenFrom
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>

            <Descriptor has_title_text>
                property swv:hasTitleText
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>
        </Structure>
        <CompVectorFunctions>
          <CompVectorFunction title_text>
            |{
              title = (@root->has_title_text).val
              title.gsub!(/\,|\.|\-|\=|\;|\:|\!|\'|\"|\(|\)|\[|\]|\~|\*|\+|\?|\¿|\!|\¡/, ' ')
              title.squeeze!(' ')
              title.downcase!
              title.strip!
              title.sub(/^(el\ |la\ |los\ |las\ )/, '')
            }|
          </CompVectorFunction>
        </CompVectorFunctions>    

        <BPVFunctions>
            <TextBPVFunction text_ref>
                defaultTextBPVFunction
                slot has_title_text captureSearchHits
                    |{ 
                    	# for now, this is a hack
                    	# really we should be checking the class of a single result in from, no the number of results
                    	from = @root->was_taken_from
                    	text = @root->has_title_text
                    	if (from.size > 0)
	                        "\"" + text.text_bpv + "\" <span class='note'>(de una inscripción en un objeto)</span>" 
	                    else
	                    	text.text_bpv
	                   	end
                    }|
            </TextBPVFunction>
        </BPVFunctions>
        
        <BPVFunctions>
            <TextBPVFunction short_text_ref>
            	slot has_title_text
                    |{ "\"" + (@root->has_title_text).text_bpv + "\"" }|
            </TextBPVFunction>
        </BPVFunctions>
    </RuleSet>
</DefinitionSet>

<DefinitionSet image_composition>
    <Vocabulary>
        <Class swv:FormalStructure>
            "Formal Structure"@en
            "Estructura Formal"@es
        </Class>

        <Class swv:Orientation>
            "Orientation"@en
            "Orientacion"@es
        </Class>

        <Class swv:Plane>
            "Plane"@en
            "Plane"@es
        </Class>

        <Property swv:hasFormalStructure>
            "Formal Structure"@en
            "Estructura Formal"@es
            range swv:FormalStructure
            adjPhraseRule es "cuya estructura formal es <refTerm/>" tailReferringTerm
            adjPhraseRule es "con una estructura formal" chaining F S
        </Property>

        <Property swv:hasOrientation>
            "Orientation"@en
            "Orientación"@es
            # inverse "Orientation of"@en
            # inverse "Orientación de"@es
            range swv:Orientation
            adjPhraseRule es "cuya orientación es <refTerm/>" tailReferringTerm
            adjPhraseRule es "con una orientación" chaining F S
        </Property>

        <Property swv:hasPlane>
            "Plane"@en
            "Plano"@es
            range swv:Plane
            adjPhraseRule es "cuyo plano es <refTerm/>" tailReferringTerm
            adjPhraseRule es "con un plano" chaining F S            
        </Property>

     </Vocabulary>
        <RepositorySetup>
            <SOC formal_structures>
                "Types of formal structures"@en 
                "Tipos de estructuras formales"@es
                hasGroupDomain swv:FormalStructure
                bindToRuleSet thing
                secondaryLevel
            </SOC>

            <SOC orientations>
                "Types of orientations"@en 
                "Tipos de orientaciones"@es
                hasGroupDomain swv:Orientation
                bindToRuleSet thing
                secondaryLevel
            </SOC>

            <SOC planes>
                "Types of planes"@en 
                "Tipos de planos"@es
                hasGroupDomain swv:Plane
                bindToRuleSet thing
                secondaryLevel
            </SOC>
        </RepositorySetup>
</DefinitionSet>

<DefinitionSet collection_level_descriptions>
    <Vocabulary>
        <Property swv:hasExtendedIdentifier>
            "Identificador extendido"@es
            subPropertyOf swv:hasUniqueIdentifier
        </Property>
        
        <Property swv:hasShortTitle>
            "Título breve"@es
            subPropertyOf swv:hasTitle
        </Property>
        
        <Property swv:hasSize>
            "Volumen"@es
        </Property>
        
        <Property swv:hasInstitutionalHistoryAndBiography>
            "Historia institucional / biográfica"@es
        </Property>
        
        <Property swv:hasArchivalHistory>
            "Historia archivística"@es
        </Property>
        
        <Property swv:hasInclusionRoute>
            "Forma de ingreso"@es
        </Property>
        
        <Property swv:hasExtensionAndContentSummary>
            "Resumen de alcance y contenido"@es
        </Property>
        
        <Property swv:hasValorationSelectionAndRemovalInfo>
            "Valoración, selección y eliminación"@es
        </Property>
        
        <Property swv:hasNewAdditions>
            "Nuevos ingresos"@es
        </Property>
        
        <Property swv:hasArchivalOrganization>
           "Organización"@es
        </Property>
        
        <Property swv:hasAccessTerms>
            "Condiciones de acceso"@es
        </Property>
        
        <Property swv:hasCopyingTerms>
            "Condiciones de reproducción"@es
        </Property>
        
        <Property swv:hasOtherCopiesInfo>
           "Existencia de otros ejemplares"@es
        </Property>
        
        <Property swv:hasDocumentalistsNote>
            "Nota de los documentalistas"@es
        </Property>
        
        <Property swv:usesRulesOrStandards>
            "Reglas o normas"@es
        </Property>
        
        <Property swv:hasDescriptionDate>
            "Fecha de descripción"@es
        </Property>
    </Vocabulary>
</DefinitionSet>