diff --git a/examples/typenormalization/.gitignore b/examples/typenormalization/.gitignore
new file mode 100644
index 000000000..14d86ad62
--- /dev/null
+++ b/examples/typenormalization/.gitignore
@@ -0,0 +1 @@
+/cache
diff --git a/examples/typenormalization/Makefile b/examples/typenormalization/Makefile
new file mode 100644
index 000000000..a4b4820c1
--- /dev/null
+++ b/examples/typenormalization/Makefile
@@ -0,0 +1,7 @@
+test: cache/saogf.ttl
+ python test_categories.py
+
+cache/saogf.ttl: cache
+ curl -s https://libris.kb.se/sparql -HAccept:text/turtle --data-urlencode 'query=PREFIX : CONSTRUCT WHERE { ?a a :GenreForm ; :inScheme ; :broader ?b }' -o $@
+cache:
+ mkdir -p cache
diff --git a/examples/typenormalization/README.md b/examples/typenormalization/README.md
new file mode 100644
index 000000000..9fa543fee
--- /dev/null
+++ b/examples/typenormalization/README.md
@@ -0,0 +1,6 @@
+To run tests:
+
+ $ pip install -r requirements.txt
+ $ make test
+
+(Add `-d` cmdline flag see full OWL-RL output.)
diff --git a/examples/typenormalization/carrierclasses.ttl b/examples/typenormalization/carrierclasses.ttl
new file mode 100644
index 000000000..190b30cc8
--- /dev/null
+++ b/examples/typenormalization/carrierclasses.ttl
@@ -0,0 +1,584 @@
+prefix rdfs:
+prefix owl:
+prefix skos:
+prefix bibo:
+prefix dc:
+prefix sdo:
+prefix ptg:
+prefix bf:
+
+prefix :
+prefix marc:
+
+prefix saogf:
+prefix kbrda:
+
+
+#:Instance a owl:Class ; ptg:abstract true .
+# NOTE: En del Instanser/bärarformer är mångfaldigbara (såsom Tryckt), en del är (i regel?) unika (såsom Canvas)?
+
+# TODO: For export-to-bf+rda or revert-to-marc; infer type-like properties
+# linking to "bases" derived via exactMatch or broadMatch of given types. For
+# instance types, that mostly means :carrierType (unless some enum types are
+# kept as subclasses of :GenreForm).
+
+
+# Complex Instance Classes (Single Unit)
+
+:PrintedVolume a owl:Class ;
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :Print
+ [ owl:onProperty :carrierType ;
+ owl:hasValue kbrda:Volume ]
+ ) .
+
+:CDBook a owl:Class ;
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :Electronic
+ [ owl:onProperty :carrierType ;
+ owl:hasValue kbrda:AudioDisc ]
+ [ owl:onProperty :instanceOf ;
+ owl:someValuesFrom :BookForm ]
+ ) .
+
+:EBook a owl:Class ;
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :Electronic # :DigitalResource
+ [ owl:onProperty :instanceOf ;
+ owl:someValuesFrom :BookForm ]
+ ) ;
+ rdfs:label "E-bok"@sv .
+
+# TODO: used by whom? Not Webbsök...
+#:EAudioBook a owl:Class ;
+# :category :pending, :complex ;
+# owl:intersectionOf (
+# :Electronic
+# [ owl:onProperty :instanceOf ;
+# owl:someValuesFrom :AudioBook ]
+# ) .
+
+# Multimedia AudioBook + WrittenBook Bundle ?
+
+#CDMap
+#ESerial
+#Music
+#MusicCD
+
+
+#---- FIXME: Either turn into :complex intersection patterns, or *just* move to (RDA) carriers or materials/formats...
+
+:PhysicalResource a owl:Class ;
+ rdfs:subClassOf :Instance , dc:PhysicalResource ;
+ rdfs:label "Fysisk resurs"@sv , "Physical resource"@en .
+ # NOTE: :transitiveBaseClassOf :PhysicalObject .
+
+# Unmediated
+
+:Unmediated a owl:Class, :MediaType ;
+ ptg:abstract true ;
+ rdfs:subClassOf :PhysicalResource ;
+ skos:exactMatch kbrda:Unmediated ;
+ rdfs:label "Omedierad resurs"@sv , "Unmediated"@en .
+
+# Vocab Macro for type-like on carrier...:
+# INSERT {
+# ?enumType rdfs:subClassOf [ a owl:Restriction;
+# owl:onProperty bf2:carrier; owl:hasValue ?enumType ] .
+#} WHERE {
+# ?enumProp rdfs:subPropertyOf rdf:type ;
+# rdfs:range ?metaType .
+# ?enumType a ?metaType .
+#}
+
+
+# TODO: Printed vs. Handmade as mixins for precoordinated (7x7)?
+:Print a owl:Class;
+ rdfs:subClassOf :Unmediated .
+
+# Untenable(?): Handwritten / Typewritten / Photocopied => Purpose (Genre) OR Manufacture/Production
+#:Handwritten a owl:Class; rdfs:subClassOf :Unmediated .
+#:Typewrittten a owl:Class; rdfs:subClassOf :Unmediated .
+
+:Manuscript a owl:Class ; # TODO: changed to Work in BF
+ rdfs:subClassOf :Unmediated .
+
+# mer extraordinärt? Sitter på exemplar?
+#:Photocopied a owl:Class; rdfs:subClassOf :Unmediated ; skos:related marc:RegularPrintReproduction .
+
+# fmt:LargeText a :Format ?
+
+:Volume a owl:Class, :CarrierType ;
+ #ptg:abstract true ;
+ skos:exactMatch kbrda:Volume ;
+ rdfs:subClassOf :Unmediated ;
+ rdfs:label "Volym"@sv , "Volume"@en .
+
+#:MassProducedVolume a owl:Class ;
+# rdfs:subClassOf :MassProduced, :Volume .
+#
+#:RareVolume a owl:Class ;
+# rdfs:subClassOf :Rare, :Volume .
+
+:PrintedVolume a owl:Class ;
+ rdfs:subClassOf :Print, :Volume ;
+ rdfs:label "Tryckt volym"@sv , "Printed Volume"@en .
+
+:HardcoverVolume a owl:Class;
+ rdfs:subClassOf :PrintedVolume .
+
+:PaperbackVolume a owl:Class;
+ rdfs:subClassOf :PrintedVolume .
+
+
+:Card a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:Card ;
+ rdfs:subClassOf :Unmediated ;
+ rdfs:label "Bildkort"@sv, "Card"@en .
+
+:Flipchart a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:Flipchart ;
+ rdfs:subClassOf :Unmediated ;
+ rdfs:label "Blädderblock"@sv, "Flipchart"@en .
+
+:Roll a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:Roll ;
+ rdfs:subClassOf :Unmediated ;
+ rdfs:label "Rulle"@sv, "Roll"@en .
+
+:Sheet a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:Sheet ;
+ rdfs:subClassOf :Unmediated ;
+ rdfs:label "Ark"@sv, "Sheet"@en .
+
+:PrintedSheet a owl:Class ;
+ rdfs:subClassOf :Print, :Sheet .
+
+:HandmadeSheet a owl:Class ;
+ rdfs:subClassOf :Unmediated, :Sheet .
+
+
+# TODO: Every non-DigitalResource is physical of course; this is for "none of the others; actual purposeful 3d object"...
+:PhysicalObject a owl:Class ; # :UnmediatedObject ?
+ skos:exactMatch kbrda:Object ;
+ rdfs:subClassOf :Unmediated .
+
+
+# TODO: "bless" these from marc to KBV going forward? (Clearer delinetion between "punktskrift" och "objekt-med-syfte"!
+#:Tactile a owl:Class ;
+# rdfs:subClassOf :Unmediated ;
+# rdfs:subClassOf [
+# owl:onProperty :format ;
+# owl:someValuesFrom :TactileMaterial ] .
+
+:BrailleResource a owl:Class ;
+ skos:exactMatch marc:Braille, marc:TextMaterialType-c ;
+ rdfs:subClassOf :Tactile, :Print .
+
+:BrailleVolume a owl:Class ;
+ rdfs:subClassOf :BrailleResource, :Volume , [ a owl:Restriction ;
+ owl:onProperty :instanceOf ;
+ owl:allValuesFrom :TactileBook
+ ] ;
+ skos:exactMatch saogf:Punktskriftsb\%C3\%B6cker .
+# :prefLabel "Punktskriftsvolym"@sv, "Braille Volume"@en .
+
+
+# "Mediated"
+
+# TODO: other StorageMedium? Magnetic / Optical / Mechanical ?
+:StorageMedium a owl:Class ;
+ ptg:abstract true ;
+ rdfs:subClassOf :PhysicalResource ;
+ rdfs:label "Lagringsmedium"@sv , "StorageMedium"@en .
+
+
+:TapeCartridge a owl:Class ;
+ rdfs:subClassOf :StorageMedium ;
+ ptg:abstract true ;
+ skos:exactMatch marc:TapeCartridge .
+
+:TapeCassette a owl:Class ;
+ rdfs:subClassOf :StorageMedium ;
+ ptg:abstract true ;
+ skos:exactMatch marc:TapeCassette .
+
+:TapeReel a owl:Class ;
+ ptg:abstract true ;
+ rdfs:subClassOf :StorageMedium ;
+ skos:exactMatch marc:TapeReel .
+
+:MagneticDisk a owl:Class, :CarrierType ;
+ skos:exactMatch marc:MagneticDisk ;
+ rdfs:subClassOf :StorageMedium .
+
+:MagnetoOpticalDisc a owl:Class, :CarrierType ;
+ skos:exactMatch marc:MagnetoOpticalDisc ;
+ rdfs:subClassOf :StorageMedium .
+
+:OpticalReel a owl:Class ;
+ ptg:abstract true ;
+ rdfs:subClassOf :StorageMedium .
+
+:OpticalDisc a owl:Class, :CarrierType ;
+ skos:exactMatch marc:OpticalDisc ;
+ rdfs:subClassOf :StorageMedium .
+
+
+:ElectronicStorageMedium a owl:Class ;
+ ptg:abstract true ;
+ skos:exactMatch marc:DirectElectronic ;
+ rdfs:subClassOf :Electronic, :StorageMedium ;
+ rdfs:label "Elektroniskt lagringsmedium"@sv , "StorageMedium"@en .
+
+:DigitalResource a owl:Class, :CarrierType ;
+ skos:broadMatch marc:Remote ;
+ skos:exactMatch marc:Online, marc:OnlineResource, kbrda:OnlineResource ;
+ rdfs:subClassOf :Electronic ;
+ rdfs:label "Digital resurs"@sv , "Digital Resource"@en .
+
+:ChipCartridge a owl:Class, :CarrierType ;
+ rdfs:subClassOf :ElectronicStorageMedium ;
+ skos:exactMatch kbrda:ComputerChipCartridge, marc:ChipCartridge ;
+ rdfs:label "Computer chip cartridge"@en .
+
+:ComputerCard a owl:Class, :CarrierType ;
+ rdfs:subClassOf :ElectronicStorageMedium ;
+ skos:exactMatch kbrda:ComputerCard, marc:ComputerCard ;
+ rdfs:label "Datorkort"@sv, "Computer card"@en .
+
+:ComputerDisc a owl:Class, :CarrierType ;
+ rdfs:subClassOf :ElectronicStorageMedium ;
+ skos:broadMatch marc:MagneticDisk ;
+ skos:exactMatch kbrda:ComputerDisc, marc:ComputerDisc ;
+ rdfs:label "Datorskiva"@sv, "Computer Disc"@en .
+
+:ComputerDiscCartridge a owl:Class, :CarrierType ;
+ rdfs:subClassOf :ElectronicStorageMedium ;
+ skos:exactMatch kbrda:ComputerDiscCartridge, marc:ComputerDiscCartridge ;
+ skos:narrowMatch marc:ComputerOpticalDiscCartridge ;
+ rdfs:label "Datorskivmagasin"@sv, "Computer disc cartridge"@en .
+
+:ComputerTapeCartridge a owl:Class, :CarrierType ;
+ rdfs:subClassOf :ElectronicStorageMedium , :TapeCartridge ;
+ skos:exactMatch kbrda:ComputerTapeCartridge ;
+ rdfs:label "Datorbandmagasin"@sv, "Computer tape cartridge"@en .
+
+:ComputerTapeCassette a owl:Class, :CarrierType ;
+ rdfs:subClassOf :ElectronicStorageMedium, :TapeCassette ;
+ skos:exactMatch kbrda:ComputerTapeCassette ;
+ rdfs:label "Datorkassett"@sv, "Computer tape cassette"@en .
+
+:ComputerTapeReel a owl:Class, :CarrierType ;
+ rdfs:subClassOf :ElectronicStorageMedium, :TapeReel ;
+ skos:exactMatch kbrda:ComputerTapeReel ;
+ rdfs:label "Datorbandspole"@sv, "Computer tape reel"@en .
+
+
+:StandaloneDevice a owl:Class, :CarrierType ;
+ skos:exactMatch marc:StandaloneDevice ;
+ rdfs:subClassOf :ElectronicStorageMedium, :PhysicalObject .
+
+
+# TODO: Is the content-as-media-type a "rebus" and enough if content is on the work?
+# Or is the *unit for device capable of sound* encoded here (so "mode of provisioning", not the "purpose of provisioning")?
+
+:SoundStorageMedium a owl:Class, :MediaType ;
+ owl:sameAs :SoundRecording ;
+ ptg:abstract true ;
+ skos:exactMatch kbrda:Audio ;
+ rdfs:subClassOf :StorageMedium ;
+ rdfs:label "Audio"@sv, "Audio"@en .
+
+:AudioDisc a owl:Class, :CarrierType ;
+ rdfs:subClassOf :SoundStorageMedium ;
+ skos:exactMatch kbrda:AudioDisc , marc:SoundDisc ;
+ rdfs:label "Ljudskiva"@sv , "Audio Disc"@en .
+
+:AudioCassette a owl:Class, :CarrierType ;
+ rdfs:subClassOf :SoundStorageMedium, :TapeCassette ;
+ skos:exactMatch kbrda:Audiocassette , marc:SoundCassette ;
+ rdfs:label "Ljudkassett"@sv , "Audio Cassette"@en .
+
+:AudioCartridge a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:AudioCartridge , marc:SoundCartridge ;
+ rdfs:subClassOf :SoundStorageMedium ;
+ rdfs:label "Ljudmagasin"@sv, "Audio cartridge"@en .
+
+:AudioCylinder a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:AudioCylinder, marc:Cylinder ;
+ rdfs:subClassOf :SoundStorageMedium ;
+ rdfs:label "Ljudcylinder"@sv, "Audio cylinder"@en .
+
+:AudioRoll a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:AudioRoll , marc:Roll ;
+ rdfs:subClassOf :SoundStorageMedium ;
+ rdfs:label "Ljudrulle"@sv, "Audio roll"@en .
+
+:AudioTapeReel a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:AudiotapeReel;
+ rdfs:subClassOf :SoundStorageMedium , :TapeReel , marc:SoundTapeReel ;
+ rdfs:label "Ljudspole"@sv, "Audiotape reel"@en .
+
+# Zero uses in Libris...
+:AudioWireRecording a owl:Class, :CarrierType ;
+ skos:exactMatch marc:WireRecording .
+
+:SoundTrackReel a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:SoundTrackReel, marc:SoundTrackFilm;
+ rdfs:subClassOf :SoundStorageMedium ;
+ rdfs:label "Sound-track reel"@en .
+
+
+:VideoStorageMedium a owl:Class, :MediaType ;
+ owl:sameAs :VideoRecording ;
+ ptg:abstract true ;
+ # TODO: deprecated baseclass :MovingImageInstance ?
+ skos:exactMatch kbrda:Video, marc:Videorecording ;
+ rdfs:subClassOf :StorageMedium ;
+ rdfs:label "Lagringsmedium för video"@sv, "Video Storage Medium"@en .
+
+:VideoDisc a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:Videodisc, marc:Videodisc ;
+ rdfs:subClassOf :VideoStorageMedium ;
+ rdfs:label "Videoskiva"@sv , "Video Disc"@en .
+
+:VideoCartridge a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:VideoCartridge, marc:Videocartridge ;
+ rdfs:subClassOf :VideoStorageMedium ;
+ rdfs:label "Videomagasin"@sv, "Video cartridge"@en .
+
+:VideoCassette a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:Videocassette, marc:Videocassette ;
+ rdfs:subClassOf :VideoStorageMedium, :TapeCassette ;
+ rdfs:label "Videokassett"@sv, "Videocassette"@en .
+
+:VideoTapeReel a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:VideotapeReel , marc:Videoreel ;
+ rdfs:subClassOf :VideoStorageMedium, :TapeReel ;
+ rdfs:label "Videospole"@sv, "Videotape reel"@en .
+
+
+# TODO: restricted to some content forms (Visual, TextAsVisual...)
+
+:Microform a owl:Class, :MediaType ;
+ ptg:abstract true ;
+ skos:exactMatch kbrda:Microform;
+ rdfs:subClassOf :StorageMedium ;
+ rdfs:label "Mikroform"@sv, "Microform"@en .
+
+:Microfilm a owl:Class, :CarrierType ;
+ ptg:abstract true ;
+ skos:exactMatch marc:Microfilm ;
+ rdfs:subClassOf :Microform .
+
+:ApertureCard a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:ApertureCard, marc:ApertureCard ;
+ rdfs:subClassOf :Microform ;
+ rdfs:label "Maskhålkort"@sv, "Aperture card"@en .
+
+:Microfiche a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:Microfiche ;
+ rdfs:subClassOf :Microform, marc:Microfiche ;
+ rdfs:label "Mikrofiche"@sv, "Microfiche"@en .
+
+:MicroficheCassette a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:MicroficheCassette, marc:MicroficheCassette ;
+ rdfs:subClassOf :Microform ;
+ rdfs:label "Mikrofichekassett"@sv, "Microfiche cassette"@en .
+
+:MicrofilmCartridge a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:MicrofilmCartridge, marc:MicrofilmCartridge ;
+ rdfs:subClassOf :Microfilm ;
+ rdfs:label "Mikrofilmsmagasin"@sv, "Microfilm cartridge"@en .
+
+:MicrofilmCassette a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:MicrofilmCassette, marc:MicrofilmCassette ;
+ rdfs:subClassOf :Microfilm ;
+ rdfs:label "Mikrofilmskassett"@sv, "Microfilm cassette"@en .
+
+:MicrofilmReel a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:MicrofilmReel, marc:MicrofilmReel ;
+ rdfs:subClassOf :Microfilm ;
+ rdfs:label "Mikrofilmsspole"@sv, "Microfilm reel"@en .
+
+:MicrofilmRoll a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:MicrofilmRoll, marc:MicrofilmRoll ;
+ rdfs:subClassOf :Microfilm, :VideoStorageMedium ;
+ rdfs:label "Mikrofilmsrulle"@sv, "Microfilm roll"@en .
+
+:MicrofilmSlip a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:MicrofilmSlip, marc:MicrofilmSlip ;
+ rdfs:subClassOf :Microform ;
+ rdfs:label "Mikrofilmsremsa"@sv, "Microfilm slip"@en .
+
+:Microopaque a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:Microopaque ;
+ rdfs:subClassOf :Microform, marc:Microopaque ;
+ rdfs:label "Mikrokort"@sv, "Microopaque"@en .
+
+
+:Microscopic a owl:Class, :MediaType ;
+ ptg:abstract true ;
+ skos:exactMatch kbrda:Microscopic;
+ rdfs:subClassOf :StorageMedium ;
+ rdfs:label "Mikroskopisk"@sv, "Microscopic"@en .
+
+:MicroscopeSlide a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:MicroscopeSlide ;
+ rdfs:subClassOf :Microscopic ;
+ rdfs:label "Mikroskoperingspreparat"@sv, "Microscope slide"@en .
+
+
+:Projected a owl:Class, :MediaType ;
+ ptg:abstract true ;
+ skos:exactMatch kbrda:Projected;
+ rdfs:subClassOf :StorageMedium ;
+ rdfs:label "Projicerad"@sv, "Projected"@en .
+
+:FilmCartridge a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:FilmCartridge ;
+ rdfs:subClassOf :Projected ;
+ rdfs:label "Filmmagasin"@sv, "Film cartridge"@en .
+
+:FilmCassette a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:FilmCassette ;
+ rdfs:subClassOf :Projected ;
+ rdfs:label "Filmkassett"@sv, "Film cassette"@en .
+
+:FilmReel a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:FilmReel ;
+ rdfs:subClassOf :Projected ;
+ rdfs:label "Filmspole"@sv, "Film reel"@en .
+
+:FilmRoll a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:FilmRoll ;
+ rdfs:subClassOf :Projected ;
+ rdfs:label "Filmrulle"@sv, "Film roll"@en .
+
+:Filmslip a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:Filmslip, marc:Filmslip ;
+ rdfs:subClassOf :Projected ;
+ rdfs:label "Filmremsa"@sv, "Filmslip"@en .
+
+# TODO: Ensure difference between StillImage Projected and MovingImage Projected!
+# See e.g. <>
+:Filmstrip a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:Filmstrip, marc:FilmstripRoll ;
+ rdfs:subClassOf :Projected ;
+ rdfs:label "Bildband"@sv, "Filmstrip"@en .
+
+:FilmstripCartridge a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:FilmstripCartridge, marc:FilmstripCartridge ;
+ rdfs:subClassOf :Projected ;
+ rdfs:label "Bildbandsmagasin"@sv, "Filmstrip cartridge"@en .
+
+:OverheadTransparency a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:OverheadTransparency, marc:Transparency ;
+ rdfs:subClassOf :Projected ;
+ rdfs:label "OH-bild"@sv, "Overhead transparency"@en .
+
+:Slide a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:Slide, marc:Slide ;
+ rdfs:subClassOf :Projected ;
+ rdfs:label "Diabild"@sv, "Slide"@en .
+
+
+:Stereographic a owl:Class, :MediaType ;
+ ptg:abstract true ;
+ skos:exactMatch kbrda:Stereographic ;
+ rdfs:subClassOf :StorageMedium ;
+ rdfs:label "Stereografisk"@sv, "Stereographic"@en .
+
+:StereographCard a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:StereographCard;
+ rdfs:subClassOf :Stereographic ;
+ rdfs:label "Stereografiskt kort"@sv, "Stereograph card"@en .
+
+:StereographDisc a owl:Class, :CarrierType ;
+ skos:exactMatch kbrda:StereographDisc;
+ rdfs:subClassOf :Stereographic ;
+ rdfs:label "Stereografisk skiva"@sv, "Stereograph disc"@en .
+
+
+# Instances defined in: <../../genreforms/materialformat.ttl>.
+
+:BaseMaterial rdfs:subClassOf :Material .
+
+:TactileMaterial rdfs:subClassOf :Material ;
+ skos:broadMatch marc:TacMaterialType .
+
+:ImageMaterial rdfs:subClassOf :Material ;
+ skos:broadMatch marc:NonProjectedType .
+
+:MapMaterial rdfs:subClassOf :Material ;
+ skos:broadMatch marc:MapMediumType .
+
+# TODO: Upgrade some marc: properties to KBV going forward?
+#:videoCharacteristic
+# rdfs:subPropertyOf :format ;
+# rdfs:domain :VideoStorageMedium ;
+# sdo:rangeIncludes :VideoFormat .
+
+:VideoFormat rdfs:subClassOf :Material ;
+ skos:broadMatch marc:VideoFormatType .
+
+## TODO: *when needed* for marc - map patterns to/from to some of these types...
+
+# TODO: ensure all of these (LHS) can be mapped to one specific type:
+# Then these deine a MARC rebus for its restriction on instanceOf (RHS):
+
+# :StillImageInstance :instanceOf :StillImage .
+#:StillImageInstance
+# ptg:abstract true ;
+# owl:equivalentClass [ owl:onProperty :instanceOf ; owl:allValuesFrom :StillImage ] ;
+# rdfs:subClassOf [ owl:onProperty :baseMaterial ; owl:someValuesFrom :ImageMaterial ] .
+
+# :MovingImageInstance :instanceOf :MovingImage .
+# :ProjectedImageInstance :instanceOf :ProjectedImage .
+# :NotatedMusicInstance :instanceOf :NotatedMusic .
+# :KitInstance :instanceOf :Kit .
+
+
+# TODO: OLD Aligning ideas (notes from things.ttl dating back to 2017):
+
+# Common Carrier Types
+
+#:Disc
+#:CD
+#:DVD
+
+#:Book a owl:Class;
+# rdfs:label "Book"@en, "Bok"@sv;
+# owl:equivalentClass bibo:Book;
+# rdfs:subClassOf
+# :Print,
+# [ a owl:Restriction; owl:onProperty :instanceOf; owl:allValuesFrom :Text ] .
+# [ a owl:Restriction; owl:onProperty :issuanceType; owl:hasValue :Monograph ] .
+# #[ a owl:Restriction; owl:onProperty :extent; owl:allValuesFrom :PageCount ] .
+#
+#:BookSeries a owl:Class;
+# rdfs:subClassOf :Text, :Serial .
+#
+#:MultiVolumeBook a owl:Class;
+# rdfs:label "Multipart Book"@en, "Bokverk"@sv;
+# skos:altLabel "Flervolymsbok"@sv;
+# rdfs:subClassOf :Book, :MultipartMonograph;
+# owl:equivalentClass bibo:MultiVolumeBook .
+#
+#:BookVolume a owl:Class;
+# rdfs:label "Book Volume"@en, "Bokband"@sv ;
+# skos:altLabel "Band"@sv, "Volym"@sv ;
+# rdfs:subClassOf :Book,
+# :PublicationVolume .
+#
+#:PrintedText a owl:Class;
+# rdfs:label "Tryckt text"@sv;
+# rdfs:subClassOf :TextInstance, :Print .
+#
+#:PrintedBook a owl:Class;
+# rdfs:label "Printed Book"@en, "Tryckt bok"@sv;
+# rdfs:subClassOf :Book, :PrintedText, :Volume .
diff --git a/examples/typenormalization/contentclasses.ttl b/examples/typenormalization/contentclasses.ttl
new file mode 100644
index 000000000..63a445f13
--- /dev/null
+++ b/examples/typenormalization/contentclasses.ttl
@@ -0,0 +1,518 @@
+prefix rdfs:
+prefix owl:
+prefix skos:
+prefix ptg:
+
+prefix bibo:
+prefix sdo:
+prefix bf:
+
+prefix :
+prefix saogf:
+prefix kbrda:
+
+prefix kbgf:
+
+##
+# This file depends on patterns defined in <./rdacontentpatterns.ttl> .
+
+
+# Locally defined restriction shapes
+
+:BookForm a owl:Restriction ;
+ ptg:abstract true ;
+ owl:onProperty :genreForm ;
+ owl:hasValue kbgf:Book ;
+ rdfs:label "Book"@en ,
+ "Bok"@sv ;
+ :pluralLabel "Böcker"@sv .
+
+:CartographyForm a owl:Restriction ;
+ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Kartor ;
+ :note "SAOGF *is* this general, *not* just for planar maps." .
+
+:Tactile rdfs:subClassOf [ owl:onProperty :genreForm ; owl:hasValue saogf:Taktila\%20verk ] .
+
+:StillImage rdfs:subClassOf [ owl:onProperty :genreForm ; owl:hasValue saogf:Bilder ] .
+
+:NotatedMusic rdfs:subClassOf [ owl:onProperty :genreForm ; owl:hasValue saogf:Musikalier ] .
+
+
+# Extend existing classes
+
+# TODO:
+# * If only contentType kbrda:* will be used; these *need* to be intersections? Or "probably" :Text on revert?!
+# We won't know what they are in bf either, unless e.g. a :Poster is a :Text, :Image ...
+# * RDA Content Types (some are rebuses with gf:s or even instance types)
+# * Some kbrda:* are "primary genreForm"; some could exact-match a type as a Restriction on genreForm or contentType
+
+:Cartography rdfs:subClassOf :Monograph, :CartographyForm, :CartographyContent .
+:Text rdfs:subClassOf :Monograph, :TextContent .
+:TextWithImages rdfs:subClassOf :Monograph, :TextContent, :ImageContent .
+:StillImage rdfs:subClassOf :Monograph, :ImageContent .
+:ImageAndText rdfs:subClassOf :Monograph, :TextContent, :ImageContent .
+
+:NotatedMusic rdfs:subClassOf :Monograph, :NotatedMusicContent .
+:NotatedMovement rdfs:subClassOf :Monograph, :NotatedMovementContent .
+
+:Kit rdfs:subClassOf :Monograph .
+:Object rdfs:subClassOf :Monograph, :ObjectContent .
+:Audio rdfs:subClassOf :Monograph, :AudioContent .
+:PerformedMusic rdfs:subClassOf :Monograph, :PerformedMusicContent .
+:SpokenWord rdfs:subClassOf :Monograph, :SpokenWordContent .
+:ComputerProgram rdfs:subClassOf :Monograph, :ComputerProgramContent .
+:ComputerDataset rdfs:subClassOf :Monograph, :Dataset, :ComputerDatasetContent .
+
+
+# Complex Work Classes
+
+# * Uses intersections to say: "this combo *means* this class".
+:complex a skos:Collection ;
+ rdfs:label "complex"@en, "komplex"@sv ;
+ rdfs:comment "Anges på abstrakta klasser som namnger välkända mönster, definierade som intersektioner."@sv ;
+ :code "complex" .
+
+# TODO: RenameTo :TextMonograph "Textmonografi"@sv ?
+:WrittenBook a owl:Class ;
+ owl:equivalentClass bibo:Book, sdo:Book ;
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :Text
+ :BookForm
+ ) ;
+ rdfs:label "Written book"@en ,
+ "Skriven bok"@sv ;
+ skos:altLabel "Bok"@sv, "Book"@en ;
+ :pluralLabel "Böcker"@sv .
+
+:TextAndImagesBook a owl:Class ;
+ :category :pending, :complex ;
+ rdfs:subClassOf :BookForm, :ImageAndText ;
+ rdfs:label "Text- och bilderbok"@sv, "Picture book"@en .
+
+
+:Audiobook a owl:Class ;
+ :category :pending, :complex ;
+ rdfs:subClassOf [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Ljudb%C3%B6cker ] ,
+ bibo:AudioDocument ;
+ owl:intersectionOf (
+ :Audio
+ :BookForm
+ ) .
+
+:CollectedDocument a owl:Class ;
+ :category :pending, :complex ;
+ owl:equivalentClass bibo:CollectedDocument ;
+ owl:intersectionOf (
+ :Audio
+ :BookForm
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Samlingsverk ]
+ ) .
+
+:LegalDocument a owl:Class ;
+ :category :pending, :complex ;
+ owl:equivalentClass bibo:LegalDocument ;
+ owl:intersectionOf (
+ :Monograph
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Juridiskt\%20material ]
+ ) .
+
+:Patent a owl:Class ;
+ :category :pending, :complex ;
+ owl:equivalentClass bibo:Patent ;
+ owl:intersectionOf (
+ :Monograph
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Patent ]
+ ) .
+
+:Interview a owl:Class ;
+ :category :pending, :complex ;
+ owl:equivalentClass bibo:Interview ;
+ owl:intersectionOf (
+ :Monograph
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Intervjuer ]
+ ) .
+
+:Report a owl:Class ;
+ :category :pending, :complex ;
+ owl:equivalentClass bibo:Report ;
+ owl:intersectionOf (
+ :Monograph
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Reportage ]
+ ) .
+
+:TactileBook a owl:Class ;
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :Tactile
+ :BookForm
+ [ owl:onProperty :genreForm ;
+ owl:hasValue [ skos:narrowMatch saogf:Punktskriftsb%C3%B6cker ] ]
+ ) ;
+ skos:editorialNote 'TODO: differentiate between "filtbok" och "punktskriftsbok"?'@en ;
+ rdfs:label "Tactile Book"@en ,
+ "Taktil bok"@sv .
+
+
+:Article a owl:Class ;
+ :category :pending, :complex ;
+ owl:equivalentClass bibo:Article ;
+ owl:intersectionOf (
+ :Monograph
+ [ owl:onProperty :genreForm ;
+ owl:hasValue kbgf:Article ]
+ ) .
+
+:Issue a owl:Class ;
+ :category :pending, :complex ;
+ owl:equivalentClass bibo:Issue ;
+ owl:intersectionOf (
+ :Text
+ [ owl:onProperty :genreForm ;
+ owl:hasValue kbgf:Issue ]
+ ) ;
+ rdfs:label "Tidskriftsnummer"@sv ,
+ "Periodical Issue"@en .
+
+
+:ComicIssue a owl:Class ;
+ :category :pending, :complex ;
+ rdfs:subClassOf :Issue ;
+ owl:equivalentClass sdo:ComicIssue ;
+ owl:intersectionOf (
+ :Monograph
+ [ owl:onProperty :genreForm ;
+ owl:hasValue kbgf:Issue ]
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Tecknade%20serier ]
+ ) ;
+ rdfs:label "Serietidningsnummer"@sv ,
+ "Comic Issue"@en .
+
+:ComicSerial a :GenreForm ;
+ :category :pending, :complex ;
+ rdfs:comment "TODO: series of issues vs. arc of stories?" ;
+ owl:equivalentClass sdo:ComicSeries ;
+ owl:intersectionOf (
+ :Serial
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Tecknade%20serier ]
+ ) ;
+ rdfs:label "Serietidningsserie"@sv ,
+ "Comic Series"@en .
+
+:Note a :GenreForm ;
+ :category :pending, :complex ;
+ owl:equivalentClass bibo:Note ;
+ owl:intersectionOf (
+ :Monograph
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Anteckningar ]
+ ) ;
+ rdfs:label "Anteckning"@sv ,
+ "Note"@en .
+
+:Poster a owl:Class ;
+ :category :pending, :complex ;
+ # TODO: is a TextPoster a kind of ImagePoster?
+ #ptg:abstract true ;
+ #rdfs:subClassOf :StillImage ;
+ owl:equivalentClass sdo:Poster ;
+ owl:intersectionOf (
+ :Visual
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Affischer ]
+ ) ;
+ # TODO: rewrite to shorthand classes:
+ #owl:intersectionOf (
+ # :Monograph
+ # [ owl:onProperty :category ;
+ # owl:hasValue kbgf:Affisch]
+ # ) ;
+ rdfs:label "Affisch"@sv, "Poster"@en ;
+ :pluralLabel "Affischer"@sv .
+
+:Photograph a owl:Class ;
+ :category :pending, :complex ;
+ #rdfs:subClassOf :StillImage ;
+ owl:equivalentClass sdo:Photograph ;
+ owl:intersectionOf (
+ :StillImage
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Fotografier ]
+ ) ;
+ rdfs:label "Fotografi"@sv, "Photograph"@en ;
+ :pluralLabel "Fotografier"@sv .
+
+:ImagePoster a owl:Class ;
+ :category :pending, :complex ;
+ rdfs:subClassOf :Poster , :ImageContent ;
+ rdfs:label "Bildaffisch"@sv, "Image Poster"@en .
+
+:TextPoster a owl:Class ;
+ :category :pending, :complex ;
+ rdfs:subClassOf :Poster , :TextContent ;
+ rdfs:label "Textaffisch"@sv, "Text Poster"@en .
+
+:ImageAndTextPoster a owl:Class ;
+ :category :pending, :complex ;
+ rdfs:subClassOf :ImagePoster, :TextPoster ;
+ rdfs:label "Bild- och textaffisch"@sv, "Image and Text Poster"@en .
+
+
+:IllustratedWork a owl:Class ;
+ :category :pending, :complex ;
+ rdfs:subClassOf :ImageContent ;
+ owl:intersectionOf (
+ :Visual
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Illustrerade%20verk ]
+ ) ;
+ rdfs:label "Illustrerat verk"@sv ,
+ "Illustrated Work"@en .
+
+:Brochure a owl:Class ;
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :Text
+ [ owl:onProperty :genreForm ;
+ owl:hasValue ]
+ ) ;
+ rdfs:label "Broschyr"@sv ,
+ "Brochure"@en .
+
+:Comic a owl:Class ;
+ :category :pending, :complex ;
+ rdfs:subClassOf :IllustratedWork ;
+ owl:intersectionOf (
+ :Monograph
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Serietidningar ]
+ ) .
+
+:ComicIssue a owl:Class ;
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :Comic
+ :Issue
+ ) ;
+ rdfs:label "Serietidningsnummer"@sv ,
+ "Comic Issue"@en .
+
+:ComicStory a owl:Class ;
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :Comic
+ [ owl:onProperty :genreForm ;
+ owl:hasValue kbgf:ShortStory ]
+ ) .
+
+:GraphicNovel a owl:Class ;
+ :category :pending, :complex ;
+ rdfs:subClassOf :ComicIssue ; # TODO: really ComicIssue?
+ owl:intersectionOf (
+ :Text
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Serieromaner ]
+ ) .
+
+
+# FIXME: remove instancetype :Map ; compute on revert (if work is :Cartography, prefer Map over all non-electronic?)
+:CartographicImage a owl:Class ;
+ ptg:abstract true ;
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :Cartography
+ :CartographicImageContent
+ [ owl:onProperty :genreForm ;
+ owl:hasValue kbgf:Map ]
+ ) ;
+ rdfs:label "Karta"@sv , "Map"@en .
+
+:Atlas a owl:Class ;
+ ptg:abstract true ;
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :Cartography
+ :BookForm
+ :TextContent
+ :CartographicImageContent
+ ) ;
+ rdfs:label "Atlas"@sv ,
+ "Atlas"@en .
+
+:CartographicGlobe a owl:Class ;
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :Cartography
+ :CartographicThreeDimensionalFormContent
+ [ owl:onProperty :genreForm ;
+ owl:hasValue kbgf:Globe ]
+ ) ;
+ rdfs:label "Kartglob"@sv ,
+ "Cartographic Globe"@en ;
+ skos:altLabel "Jord- eller månglob"@sv .
+
+
+# TODO:
+# * In SAOGF, link up *all* SAOGF-Musik[*instrument] as hints for "Music-content"?
+
+:PerformedMusic a owl:Class ;
+ # TODO: is this the "real" :Music (subClassOf :Audio), and :Music is more "genre"?
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :Music
+ [ owl:onProperty :genreForm ;
+ owl:hasValue kbrda:PerformedMusic ]
+ ) ;
+ rdfs:label "Performed Music"@en ,
+ "Framförd musik"@sv .
+
+
+:Film a owl:Class ;
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :MovingImage
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Filmer ]
+ ) ;
+ owl:equivalentClass bibo:Film ;
+ rdfs:label "Film"@sv ,
+ "Film"@en .
+
+
+:ComputerGame a owl:Class ;
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :Multimedia
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Datorspel ]
+ ) .
+
+
+# Collecting Work Classes
+
+:Archive a owl:Class ;
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :Collection
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Arkiv ]
+ ) ;
+ rdfs:label "Arkiv"@sv ,
+ "Archive"@en .
+
+:Database a owl:Class ;
+ :category :pending, :complex ;
+ #rdfs:subClassOf :Dataset ;
+ owl:intersectionOf (
+ :Integrating
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Databaser ]
+ ) ;
+ #skos:narrowMatch marc:UpdatingDatabase ;
+ rdfs:label "Databas"@sv ,
+ "Database"@en .
+
+# Serial Work Classes
+
+:SerialPublication a owl:Class ;
+ :category :pending, :complex ;
+ owl:intersectionOf (
+ :Serial
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Seriella%20publikationer ]
+ ) ;
+ rdfs:label "Seriell publikation"@sv ,
+ "Serial Publication"@en .
+
+:Periodical a owl:Class ;
+ :category :pending, :complex ;
+ rdfs:seeAlso ;
+ rdfs:subClassOf :SerialPublication ;
+ owl:intersectionOf (
+ :Serial
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Periodika ]
+ ) ;
+ # TODO: :scopeNote Tidskrift vs. Tidning vs. Årsbok ()
+ skos:altLabel "Periodika"@sv ;
+ rdfs:label "Tidskrift"@sv ,
+ "Periodical"@en ;
+ :pluralLabel "Tidskrifter"@sv .
+
+#:CreativeWorkSeries a owl:Class;
+# owl:equivalentClass sdo:CreativeWorkSeries;
+# rdfs:subClassOf :Serial;
+# rdfs:label "Creative Work Series"@en, "Utgivningsserie"@sv .
+
+:MonographicSeries a owl:Class ;
+ :category :pending, :form ;
+ owl:equivalentClass bibo:Series ,
+ bf:Series ;
+ owl:intersectionOf (
+ :Serial
+ [ owl:onProperty :genreForm ;
+ owl:hasValue kbgf:MonographicSeries ]
+ ) .
+
+:Blog a owl:Class ;
+ :category :pending, :complex ;
+ owl:equivalentClass sdo:Blog ;
+ owl:intersectionOf (
+ :Integrating
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Bloggar ]
+ ) .
+
+:ComicStory a owl:Class ;
+ :category :pending, :complex ;
+ owl:equivalentClass sdo:ComicStory ;
+ owl:intersectionOf (
+ :Monograph
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Serienoveller ]
+ ) .
+
+:ShortStory a owl:Class ;
+ :category :pending, :complex ;
+ owl:equivalentClass sdo:ShortStory ;
+ owl:intersectionOf (
+ :Monograph
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Noveller ]
+ ) .
+
+:ReferenceWork a owl:Class ;
+ :category :pending, :complex ;
+ owl:equivalentClass bibo:ReferenceSource ;
+ owl:intersectionOf (
+ :Monograph
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Referensverk ]
+ ) .
+
+:Review a owl:Class ;
+ :category :pending, :complex ;
+ owl:equivalentClass sdo:Review ;
+ owl:intersectionOf (
+ :Monograph
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Recensioner ]
+ ) .
+
+:Standard a owl:Class ;
+ :category :pending, :complex ;
+ owl:equivalentClass bibo:Standard ;
+ owl:intersectionOf (
+ :Monograph
+ [ owl:onProperty :genreForm ;
+ owl:hasValue saogf:Standarder ]
+ ) .
diff --git a/examples/typenormalization/examples.trig b/examples/typenormalization/examples.trig
new file mode 100644
index 000000000..06392dec7
--- /dev/null
+++ b/examples/typenormalization/examples.trig
@@ -0,0 +1,84 @@
+prefix rdfs:
+prefix owl:
+prefix :
+prefix kbgf:
+prefix kbrda:
+prefix saogf:
+prefix barngf:
+
+ { a :WrittenBook }
+ { a :Text ; :genreForm kbgf:Book ; :contentType kbrda:Text }
+ { a :WrittenBook; :genreForm saogf:Romaner }
+ { a :Text ; :genreForm saogf:Romaner ; :contentType kbrda:Text }
+
+ { a :Audiobook }
+ { a :Audio ; :genreForm kbgf:Book }
+ { a :Audiobook ; :genreForm saogf:Ljudb%C3%B6cker }
+ { a :Audio ; :genreForm saogf:Ljudb%C3%B6cker }
+
+ { a :EBook }
+ { a :Electronic ; :instanceOf [ a :BookForm ] }
+
+ { a :CDBook }
+ { a :Electronic ; :carrierType kbrda:AudioDisc ; :instanceOf [ a :BookForm ] }
+
+ { a :ComputerGame }
+ { a :Multimedia ; :genreForm saogf:Datorspel }
+
+ { a :Multimedia }
+ { a :ComputerGame }
+
+ { a :Serial ; :genreForm saogf:Datorspel }
+ { a :Serial ; :genreForm saogf:Datorspel }
+ { a :ComputerGame }
+
+ { a :Comic ; :genreForm kbgf:Comic }
+ { a :Text ; :genreForm kbgf:Comic ; :contentType kbrda:StillImage }
+ { a :Comic ; :genreForm saogf:Tecknade%20serier }
+ { a :Text ; :genreForm kbgf:Comic, saogf:Tecknade%20serier ; :contentType kbrda:StillImage }
+
+ { a :ComicIssue }
+ { a :Text ; :genreForm kbgf:Comic, kbgf:Issue ; :contentType kbrda:StillImage }
+
+ { a :Serial ; :genreForm saogf:Tecknade%20serier }
+ { a :Comic }
+
+ { a :GraphicNovel }
+ { a :Text, :BookForm ; :genreForm saogf:Serieromaner , saogf:Romaner }
+
+ { a :Atlas }
+ { a :Cartography ; :genreForm kbgf:Book ; :contentType kbrda:Text, kbrda:CartographicImage }
+
+ { a :Globe }
+ { a :Cartography ; :contentType kbrda:CartographicThreeDimensionalForm }
+
+ { a :Photograph ; :genreForm saogf:Portr%C3%A4tt }
+ { a :StillImage ; :genreForm saogf:Fotografier, saogf:Portr%C3%A4tt ; :contentType kbrda:StillImage }
+
+# TODO: :BrailleVolume :instanceOf [a :WrittenBook ] .
+# a :WrittenBook ;
+# :genreForm saogf:Punktskriftsb%C3%B6cker ;
+# spec:query 'ASK { a :TactileBook }' .
+#
+# a :InteractiveObject ; :genreForm kbgf:TactileBook ;
+# spec:query 'ASK { a :TactileBook }' .
+
+# Instance Types
+
+# TODO: Handmade (vs. Printed)?
+#<66829ddb> a :Book ; :genreForm kbgf:Manuscript .
+#<66829d88> a :HandmadeVolume ; :instanceOf <66829ddb> .
+#
+#<66829def> a :Text ; :genreForm kbgf:Decree .
+#<66829d8a> a :HandmadeSheet ; :instanceOf <66829def> .
+#
+#<66829e07> a :StillImage ; :genreForm kbgf:ImagePoster .
+#<66829d8c> a :PrintedSheet ; :instanceOf <66829e07> .
+#
+#<66829e1d> a :StillImage ; :genreForm kbgf:Poster .
+#<66829d8f> a :PrintedSheet ; :instanceOf <66829e1d> .
+#<66829d92> a :DigitalSheet ; :instanceOf <66829e1d> .
+#
+#<66829d94> a :HandmadeSheet ; :instanceOf [ a :StillImage ; :genreForm kbgf:MapInPlano ] .
+#<66829d97> a :DigitalVolume ; :instanceOf [ a :Book ; :genreForm kbgf:Atlas ] .
+#<66829d98> a :DigitalVolume ; :instanceOf [ a :AudioBook ; :genreForm kbgf:SpokenBook ] .
diff --git a/examples/typenormalization/marcmatches.ttl b/examples/typenormalization/marcmatches.ttl
new file mode 100644
index 000000000..ad0eb07e4
--- /dev/null
+++ b/examples/typenormalization/marcmatches.ttl
@@ -0,0 +1,826 @@
+prefix :
+prefix marc:
+prefix saogf:
+prefix tgm:
+
+# Stat numbers: Most GenreForm are tagged below (to aid prioritization).
+
+# TODO: "Primary?" means candidate as a basic Form (or a clear subclass thereof?).
+
+# TODO: what of these loc.gov-mappings are used by bibframe2marc to *produce* bib 008 values?
+
+# TODO: "Vad är skönlitteratur?" -
+# marc:NotFictionNotFurtherSpecified . # 8524469 # [also ssb]
+
+##
+# marc:ConferencePublicationType
+#--
+marc:ConferencePublication # 251347 # Primary? [also ssb]
+ :closeMatch saogf:Konferensmaterial .
+# marc:ConferencePublication marc:ConferencePublicationType-1
+
+##
+# marc:BooksBiographyType
+
+marc:Autobiography # [a] also mac:MusicTextType # 41138 # [also ssb]
+ :closeMatch saogf:Sj%C3%A4lvbiografier ;
+ :closeMatch . # "Autobiographies"@en .
+
+marc:IndividualBiography # [b] 69428 # [also ssb]
+ :broadMatch saogf:Biografier ;
+ :broadMatch . # "Biographies"@en .
+
+marc:CollectiveBiography # [c] 17177 # Primary? [also ssb]
+ :broadMatch saogf:Biografier ;
+ :broadMatch . # "Biographies"@en .
+
+marc:ContainsBiographicalInformation # [d] 43201 # [also ssb]
+ :broadMatch saogf:Biografier ;
+ :broadMatch . # "Biographies"@en .
+
+##
+# Books and Serials (continuing) -- marc:BooksContentsType | marc:SerialsNatureType | marc:SerialsContentsType
+
+marc:LegalArticle # [g] 642 # Primary? [also ssb]
+ :broadMatch saogf:Juridiskt%20material ;
+ :broadMatch . # "Law materials"@en .
+
+marc:Legislation # [l] 5196 # [also ssb]
+ :broadMatch saogf:Juridiskt%20material ;
+ :broadMatch . # "Law materials"@en .
+
+marc:SerialsNatureType-h # [h] 561 # [on Serials]; marc:Biography Primary? [also ssb]
+ :broadMatch saogf:Biografier ;
+ :broadMatch . # "Biographies"@en .
+
+marc:LawReportOrDigest # [w] 326 # Primary?
+ :broadMatch saogf:Juridiskt%20material ;
+ :broadMatch . # "Law materials"@en .
+
+marc:Yearbook # [y] 6968 # [also ssb]
+ # a :ContentType ; # 1 # [also ssb]
+ :closeMatch saogf:%C3%85rsb%C3%B6cker ;
+ :closeMatch . # "Yearbooks"@en .
+
+marc:Index # [i] 3941 # Primary? [also ssb]
+ :closeMatch . # "Indexes"@en .
+# TODO:
+# Either: Delete - Unlikely to have been consistently and correctly applied?
+# - How is it used in practise? "Sök i 008 minus Index för de som vill ha faktiskt innehåll"@sv?)
+# Or: << marc:Index :broadMatch saogf:Referensverk >> a :Suggestion ; :source kbstaff:viklun .
+
+marc:Statistics # [s] 20197 # Primary? [also ssb]
+ :closeMatch saogf:Statistik ;
+ :closeMatch . # "Statistics"@en .
+
+marc:Handbook # [f] 8727 # Primary? [also ssb]
+ # a :ContentType ; # 2 # Primary? [also ssb]
+ #:closeMatch saogf:Handb%C3%B6cker%2C%20manualer%20etc\. ;
+ :closeMatch ;
+ :closeMatch . # "Handbooks and manuals"@en .
+
+marc:Treaty # [z] 1297 # [also ssb]
+ :closeMatch . # "Treaties"@en .
+
+marc:Discography # [k] 2287 # Primary? [also ssb]
+ :closeMatch saogf:Diskografier ;
+ :closeMatch . # "discography"@en .
+
+marc:TechnicalReport # [t] 466 # Primary? [also ssb]
+ # a :ContentType . # 2 # Primary? [also ssb]
+ :closeMatch . # "Technical reports"@en .
+
+marc:Filmography # [q] 2269 # [also ssb]
+ :closeMatch saogf:Filmografi ; # [new saogf->lcgft mapping 241015]
+ :closeMatch . # "filmography"@en .
+
+marc:Directory # [r] 2604 # Primary? [also ssb]
+ :closeMatch saogf:Adresskalendrar ;
+ :closeMatch . # "Directories"@en .
+
+marc:Encyclopedia # [e] 9137 # [also ssb]
+ :closeMatch saogf:Encyklopedier ;
+ :closeMatch . # "Encyclopedias"@en .
+
+marc:ComicOrGraphicNovel # [6] 17902 # Primary? [also ssb]
+ # a :ContentType ; # 20 # Primary? [also ssb]
+ :broadMatch saogf:Tecknade%20serier ;
+ :closeMatch . # "Comics (Graphic works)"@en .
+
+marc:LegalCaseOrCaseNote # [v] 431 # Primary?
+ # a :ContentType ; # 1 # Primary?
+ :broadMatch saogf:Juridiskt%20material ;
+ :broadMatch . # "Law materials"@en .
+
+marc:Catalog # [c] 61570 # Primary? [also ssb]
+ # a :ContentType ; # 4 # Primary? [also ssb]
+ :closeMatch saogf:Kataloger , tgm:Kataloger ;
+ :closeMatch . # "Catalogs"@en .
+
+marc:Thesis
+ :closeMatch saogf:Avhandlingar ;
+ # a :ContentType . # 16 # Primary? [also ssb] 326407# Primary? [also ssb]
+ :closeMatch ; :code "m"; :label "Academic theses" .
+
+marc:Dictionary # [d] 14033 # Primary? [also ssb]
+ # a :ContentType ; # 1 # Primary? [also ssb]
+ :closeMatch saogf:Lexikon ;
+ :closeMatch . # "Dictionaries"@en .
+
+marc:Bibliography # [b]
+ # a :ContentType . # 5 # [also ssb] 424362# [also ssb]
+ :closeMatch saogf:Bibliografier ;
+ :closeMatch . # "bibliography"@en .
+
+marc:Calendar # [x5]
+ # a :ContentType . # 2 # Primary?
+ :closeMatch saogf:Kalendrar ;
+ :closeMatch . # "Calendars"@en .
+
+marc:PatentDocument # [j] 661 # Primary? [also ssb]
+ :closeMatch saogf:Patent ;
+ :closeMatch . # "Patents"@en .
+
+
+##
+# marc:BooksBiographyType
+
+marc:FictionNotFurtherSpecified # [1]
+ :broadMatch saogf:Sk%C3%B6nlitteratur ; # ~ _:x670e8a6d {| a :PreferredGeneralization ; :source kbstaff:viklun |} ;
+ :closeMatch . # "Fiction"@en .
+
+marc:MixedForms # [m] 4352 # Primary? [also ssb]
+ :broadMatch saogf:Sk%C3%B6nlitteratur ; # ~ _:x670e8a6d {| a :ErasedDifference ; :source kbstaff:viklun |} ;
+ #:replacedBy marc:FictionNotFurtherSpecified ; ~ _:x670e8a6d
+ :closeMatch . # "Fiction"@en .
+
+marc:HumorSatiresEtc # [h] 3653 # [also ssb]
+ :narrowMatch saogf:Humor ; # ~ _:x670e8a3c
+ :narrowMatch saogf:Satir ; # ~ _:x670e8a3c {| a :Suggestion ; :source kbstaff:viklun |} ;
+ :closeMatch . # "Humor"@en .
+
+marc:Letter # [i] 1436 # Primary? [also ssb]
+ :closeMatch saogf:Korrespondens ;
+ # :narrowMatch saogf:Brev ; {| a :TooSpecic ; :source kbstaff:viklun |}
+ :closeMatch . # "Personal correspondence"@en .
+
+marc:Novel # [f] # 248532 # Primary? [also ssb]
+ :closeMatch saogf:Romaner ;
+ :closeMatch . # "Novels"@en .
+
+marc:ShortStory # [j] 26024 # Primary? [also ssb]
+ :closeMatch saogf:Noveller ;
+ :closeMatch . # "Short stories"@en .
+
+marc:Speech # [s] 333 # Primary? [also ssb]
+ :closeMatch saogf:Tal%20%28retorik%29 ;
+ :closeMatch . # "Speeches"@en .
+
+# N/A in codeMaps:
+
+marc:Review # a :ContentType . # 1 # [also ssb]
+ :closeMatch saogf:Recensioner . # 31024 # [also ssb]
+
+marc:StandardsSpecification # 270 # Primary?
+ :closeMatch saogf:Standarder .
+
+marc:AbstractsSummary # 1324 # Primary? [also ssb]
+ # a :ContentType . # 4 # Primary? [also ssb]
+ :broadMatch saogf:Sammanfattningar . # {| :source kbkat:viklun |}
+
+marc:ProgrammedText # 192 # Primary? [also ssb]
+ :broadMatch saogf:Instruktions-%20och%20undervisningsmaterial .
+ # a :ContentType . # 21 # Primary? [also ssb]
+
+marc:SurveysOfLiteratureInASubjectArea # 448 # [also ssb]
+ :closeMatch saogf:Forsknings%C3%B6versikter . # {| :source kbkat:viklun |}
+ # a :ContentType . # 1 # [also ssb]
+
+# marc:Offprint # 65 # Primary?
+marc:Festschrift :closeMatch saogf:Festskrifter . # 32382 # [also ssb]
+
+
+##
+# marc:BooksBiographyType AND marc:MusicTextType
+
+marc:Poetry # [p] 51022 # [also ssb]
+ :closeMatch saogf:Poesi ;
+ :closeMatch . # "Poetry"@en .
+marc:Drama # [d] 17418 # [also ssb]
+ :closeMatch saogf:Dramatik ;
+ :closeMatch . # "Drama"@en .
+marc:Essay # [e] 4861 # [also ssb]
+ :closeMatch saogf:Ess%C3%A4er ;
+ :closeMatch . # "Essays"@en .
+
+# N/A in codeMaps:
+# marc:NotFictionNotFurtherSpecified marc:BooksLiteraryFormType-0
+marc:ComicStrip # marc:BooksLiteraryFormType-c # 2773 # Primary? [also ssb]
+ :broadMatch saogf:Tecknade%20serier .
+
+
+##
+# marc:MusicTextType
+
+marc:Interview # [t] 69 # [also ssb]
+ :closeMatch saogf:Intervjuer ;
+ :closeMatch . # "Interviews"@en .
+
+marc:Memoir # [m] 99 # [also ssb]
+ :closeMatch saogf:Sj%C3%A4lvbiografier ;
+ :closeMatch . # "Autobiographies"@en .
+
+marc:History # [h] 110 # [also ssb]
+ :closeMatch . # "history"@en .
+
+marc:Biography # [b]
+ :closeMatch saogf:Biografier ;
+ :closeMatch . # "Biographies"@en .
+#marc:SerialsContentsType-h :broader marc:Biography . # in construct-enums.tq # 848 # marc:Biography Primary? [also ssb] # 290 # [also ssb]
+
+marc:Rehearsal # [r]
+ :closeMatch . # "rehearsals"@en .
+
+marc:Folktale # [o] 46 # [also ssb]
+ :closeMatch saogf:Folksagor ;
+ :closeMatch . # "Folk tales"@en .
+
+marc:LecturesSpeech # [l] 110 # Primary? [also ssb]
+ :broadMatch saogf:Tal%20%28retorik%29 ;
+ :broadMatch . # "Speeches"@en .
+
+marc:Fiction # [f]
+ :closeMatch . # "Fiction"@en .
+
+marc:Sound # [s]
+ :closeMatch . # "Sound recordings"@en .
+
+marc:Reporting # [g] 33 # [also ssb]
+ :broadMatch saogf:Informativa%20verk ;
+ :broadMatch . # "Informational works"@en .
+
+marc:ConferenceProceeding # [c] 9 # Primary?
+ :closeMatch saogf:Konferenser ;
+ :closeMatch . # "Conference papers and proceedings"@en .
+
+marc:Instruction # [i] 19 # Primary?
+ :broadMatch saogf:Instruktions-%20och%20undervisningsmaterial ;
+ :broadMatch . # "Instructional and educational works"@en .
+
+marc:LanguageInstruction # [j] 113 # Primary?
+ :closeMatch . # "language instruction"@en .
+
+marc:Comedy # [k] 17 # [also ssb]
+ :broadMatch saogf:Humor ;
+ :broadMatch . # "Humor"@en .
+
+# N/A in codeMaps:
+# marc:ItemIsAMusicalSoundRecording marc:MusicTextType-_ # 1 # Primary?
+
+
+##
+# marc:SerialsTypeOfSerialType
+
+marc:MonographicSeries # [m] 94048 # Primary? [also ssb]
+ :closeMatch . # "monographic series"@en .
+
+marc:Newspaper # [n] 9076 # Primary? [also ssb]
+ :closeMatch saogf:Dagstidningar ;
+ :closeMatch . # "newspaper"@en .
+
+marc:Periodical
+ # a :ContentType ; # 1 # Primary? [also ssb] 565338# Primary? [also ssb]
+ :closeMatch saogf:Periodika ;
+ :closeMatch ; :code "p"; :label "periodical" .
+
+marc:UpdatingLooseLeaf # [l] 132 # Primary?
+ :closeMatch . # "loose leaf"@en .
+
+marc:UpdatingDatabase # [d] 2960 # Primary?
+ # a :ContentType . # 4 # Primary?
+ # TODO: remove; maybe implied from possible new type :Database
+ :closeMatch saogf:Databaser ; # {| :source kbkat:viklun |}
+ :closeMatch . # "database"@en .
+
+marc:UpdatingWebSite # [w] 635 # Primary?
+ # TODO: remove; maybe implied from possible new type :Website
+ :closeMatch saogf:Webbplatser ; # {| :source kbkat:viklun |}
+ :closeMatch . # "web site"@en .
+
+# Missing in KB marc (only relvant *IF* we were to map to marc bib 008!)
+# :closeMatch ; :code "g"; :label "magazine" .
+# :closeMatch ; :code "h"; :label "blog" .
+# :closeMatch ; :code "j"; :label "journal" .
+# :closeMatch ; :code "r"; :label "repository" .
+# :closeMatch ; :code "s"; :label "newsletter" .
+# :closeMatch ; :code "t"; :label "directory" .
+
+
+##
+# marc:VisualMaterialType
+
+marc:VisualMaterialType-b # [b] :broader marc:Kit ; # 1745 # marc:Kit Primary? [also ssb]
+ :broadMatch . # "kit"@en .
+
+marc:Videorecording # [v]
+ # a :ContentType . # 1 # Primary? [also ssb] 531734# Primary? [also ssb] SHOULD_BE_INSTANCE
+ :closeMatch . # "Video recordings"@en .
+
+marc:MicroscopeSlide # [p]
+ :closeMatch . # "microscope slide"@en .
+
+marc:Realia # [r] 34 # Primary?
+ :closeMatch . # "realia"@en .
+
+marc:MotionPicture # [m] 11841 # Primary? [also ssb]
+ # a :ContentType ; # 1 # Primary? [also ssb]
+ :closeMatch saogf:Filmer ;
+ :closeMatch . # "Motion pictures"@en .
+
+marc:Graphic # [k] 8053 # Primary?
+ # a :ContentType . # 2 # Primary?
+ :closeMatch . # "graphic"@en .
+
+marc:ArtOriginal # [a] 116 # Primary?
+ :closeMatch . # "Art"@en .
+
+marc:Filmstrip # [f] 10 # Primary? [also ssb]
+ # a :ContentType . # 2 # Primary? [also ssb]
+ :closeMatch . # "filmstrip"@en .
+
+marc:ArtReproduction # [c] 31 # Primary?
+ # a :ContentType ; # 5 # Primary?
+ :closeMatch tgm:Konstreproduktioner ;
+ :closeMatch . # "art reproduction"@en .
+
+marc:VisualMaterialType-n # [n] :broader marc:Chart
+ # a :ContentType ; # 68 # marc:Chart
+ :broadMatch saogf:Diagram ;
+ :narrowMatch tgm:Diagram%20och%20tabeller ;
+ :broadMatch . # "chart"@en .
+
+marc:VisualMaterialType-g # [g] :broader marc:Game # 194 # marc:Game Primary?
+ # a :ContentType ; # 32 # marc:Game Primary?
+ :broadMatch saogf:Spel%20och%20tanken%C3%B6tter ;
+ :closeMatch . # "Puzzles and games"@en .
+
+marc:Diorama # [d] 739 #
+ :closeMatch . # "diorama"@en .
+
+marc:Toy # [w] 3 # Primary?
+ :closeMatch . # "toy"@en .
+
+
+##
+# marc:VisualMaterialType AND marc:NonProjMaterialType
+
+marc:TechnicalDrawing # [l] 109 # Primary?
+ # a :ContentType . # 6 # Primary?
+ :closeMatch . # "technical drawing"@en .
+
+marc:FlashCard # [o] 60 # Primary?
+ # a :ContentType . # 2 # Primary?
+ :closeMatch . # "flash card"@en .
+
+marc:Picture # [i] 105262 # Primary?
+ # a :ContentType ; # 86 # Primary?
+ :closeMatch tgm:Bilder ;
+ :closeMatch . # "Pictures"@en .
+
+marc:Transparency # [t] 71 # Primary?
+ # a :ContentType ; # 6 # Primary?
+ :closeMatch tgm:Genomsiktsbilder ;
+ :closeMatch . # "transparency"@en .
+
+marc:Slide # [s] 11 # Primary?
+ :closeMatch tgm:Diabilder ;
+ :closeMatch . # "slide"@en .
+
+marc:Model # [q]
+ :closeMatch . # "Models (Representations)"@en .
+
+
+##
+# marc:MapsFormatType
+
+marc:PlayingCard # [p]
+ :closeMatch tgm:Spelkort ;
+ :closeMatch . # "Playing cards"@en .
+
+marc:WallMap # [o] 350 # Primary?
+ :closeMatch . # "Wall maps"@en .
+
+marc:LooseLeaf # [r] 13 # Primary?
+ :closeMatch . # "Loose-leaf services"@en .
+
+marc:Game # [n]
+ :broadMatch saogf:Spel%20och%20tanken%C3%B6tter ;
+ :broadMatch . # "Puzzles and games"@en .
+
+marc:PictureCardPostCard # [j]
+ :closeMatch saogf:Vykort ;
+ :closeMatch tgm:Vykort ;
+ :closeMatch . # "Postcards"@en .
+
+marc:Manuscript # [e] 967 # Primary?
+ :closeMatch . # "Manuscript maps"@en .
+
+marc:Puzzle # [l] 8 # Primary?
+ :broadMatch saogf:Spel%20och%20tanken%C3%B6tter ;
+ :narrowMatch tgm:Ord-%20och%20bildg%C3%A5tor ;
+ :broadMatch . # "Puzzles and games"@en .
+
+marc:MapsFormatType-k # [k] # [on Maps]; :broader marc:Calendar # 10 # marc:Calendar Primary? # 57 # Primary?
+ :broadMatch tgm:Almanackor ,
+ saogf:Kalendrar ;
+ :broadMatch . # "Calendars"@en .
+
+
+##
+# marc:ComputerTypeOfFileType
+
+marc:Representational # [c] 13197 # Primary?
+ :closeMatch . # "representational"@en .
+
+marc:OnlineSystemOrService # [j] 135687 # Primary?
+ :closeMatch . # "online system or service"@en .
+
+marc:ComputerTypeOfFileType-h # [h] :broader marc:Sound # 47 # marc:Sound Primary? # 26 # Primary?
+ :closeMatch . # "sound"@en .
+
+marc:ComputerTypeOfFileType-g # [g] :broader marc:Game # 3803 # marc:Game Primary? [also ssb] # 132 # Primary?
+ # a :ContentType . # 2 # marc:Game Primary? [also ssb]
+ :closeMatch saogf:Datorspel ;
+ :closeMatch . # "game"@en .
+
+marc:InteractiveMultimedia # [i] 420 # Primary? [also ssb]
+ :closeMatch . # "interactive multimedia"@en .
+
+marc:ComputerProgram # [b] 34 # Primary?
+ # a :ContentType . # 24 # Primary?
+ :closeMatch . # "computer program"@en .
+
+marc:Font # [f]
+ :closeMatch . # "font"@en .
+
+marc:Document # [d] 2885 # Primary? [also ssb]
+ :broadMatch tgm:Dokument ;
+ :closeMatch . # "document (computer)"@en .
+
+marc:BibliographicData # [e]
+ :closeMatch . # "bibliographic data"@en .
+
+marc:NumericData # [a] 22 # Primary?
+ :closeMatch . # "numeric data"@en .
+
+# N/A in codeMaps:
+# marc:Combination marc:ComputerTypeOfFileType-m # 28574 # Primary? [also ssb]
+# marc:Combination a :ContentType . # 1 # Primary? [also ssb]
+
+#marc:Other a :ContentType . # 1 # [also ssb] # 2190 # [also ssb]
+
+
+##
+# Instance marc:MapMaterialType ?
+#----
+# marc:Model marc:MapMaterialType-q
+# marc:MapATwoDimensionalMap marc:MapMaterialType-j # 20157 # Primary? [also ssb]
+
+marc:Section # ? marc:MapMaterialType-s # 9 # Primary? [also ssb]
+ :closeMatch tgm:Sektionsritningar .
+
+marc:View # = marc:MapMaterialType-y # 3 # Primary?
+ :closeMatch tgm:Vyer .
+
+marc:RemoteSensingImage
+ :broadMatch tgm:Satellitbilder . # marc:MapMaterialType-r # 33 # Primary?
+marc:MapMaterialType-d # UNDEF # 2134 # marc:Atlas Primary? [also ssb]
+ :broadMatch tgm:Atlaser .
+# marc:Profile marc:MapMaterialType-k
+# marc:Diagram marc:MapMaterialType-g
+
+##
+# marc:NonProjMaterialType TODO: on carriers ...
+#----
+# marc:Photonegative marc:NonProjMaterialType-g
+# marc:Poster marc:NonProjMaterialType-k # 620 # Primary?
+# marc:ActivityCard marc:NonProjMaterialType-a
+marc:PhotomechanicalPrint # = marc:NonProjMaterialType-f # 156 # Primary?
+ :closeMatch tgm:Fotomekaniska%20reproduktioner .
+
+marc:Print # = marc:NonProjMaterialType-j # 15526 # Primary?
+ :closeMatch tgm:Tryck .
+
+marc:Painting # = marc:NonProjMaterialType-e # 627 # Primary?
+ :closeMatch tgm:M%C3%A5lningar .
+
+# marc:Radiograph marc:NonProjMaterialType-r # 1 # Primary?
+# marc:Photoprint marc:NonProjMaterialType-h # 37816 # Primary?
+# marc:StudyPrint marc:NonProjMaterialType-s # 1 # Primary? [also ssb]
+
+marc:Collage # = marc:NonProjMaterialType-c
+ :closeMatch tgm:Collage .
+
+# marc:NonProjMaterialType-n UNDEF
+# marc:Postcard marc:NonProjMaterialType-p # 236 # Primary?
+
+marc:Drawing # = marc:NonProjMaterialType-d # 7018 # Primary? [also ssb]
+ :closeMatch tgm:Teckningar .
+
+# marc:NonProjMaterialType-v UNDEF # 57 # = marc:Photograph Primary?
+# marc:Icon marc:NonProjMaterialType-q
+
+
+# marc:GlobeMaterialType (missing in lcMarc2bfCodeMap?)
+marc:CelestialGlobe # = marc:GlobeMaterialType-a ; a marc:GlobeMaterialType
+ :closeMatch tgm:Himmelsglober .
+marc:TerrestrialGlobe # = marc:GlobeMaterialType-c # 59 # Primary?
+ :closeMatch tgm:Jordglober .
+# marc:PlanetaryOrLunarGlobe marc:GlobeMaterialType-b
+# marc:EarthMoonGlobe marc:GlobeMaterialType-e
+
+##
+# marc:MapsMaterialType -- some are serials (see marcframe TODO)
+# (missing in lcMarc2bfCodeMap?)
+marc:Map :closeMatch tgm:Kartor .
+marc:Globe # = marc:MapsMaterialType-d # 132 # Primary?
+ :closeMatch tgm:Glober .
+marc:Atlas # marc:MapsMaterialType-e # 2044 # Primary? [also ssb]
+ :closeMatch tgm:Atlaser .
+# marc:SeparateMapSupplementToAnotherWork marc:MapsMaterialType-f # 240 # Primary?
+# marc:MapSeries marc:MapsMaterialType-b # 1403 # Primary? [also ssb]
+# marc:MapBoundAsPartOfAnotherWork marc:MapsMaterialType-g # 260 # Primary?
+# marc:SingleMap marc:MapsMaterialType-a # 14589 # Primary? [also ssb]
+# marc:MapSerial marc:MapsMaterialType-c # 17 # Primary?
+
+####################
+# Instance forms (not on works; but some should be):
+marc:Diagram # 28 # Primary?
+ :closeMatch tgm:Diagram%20och%20tabeller .
+# marc:BibliographicData . # 26 #
+# marc:Photonegative . # 16 # Primary?
+# marc:CelestialGlobe . # 15 # Primary?
+# marc:Model . # 10 # Primary?
+# marc:PlanetaryOrLunarGlobe . # 3 # Primary?
+# marc:Profile . # 3 # Primary?
+# marc:Collage . # 2 # Primary?
+marc:NonProjMaterialType-n # 1 # marc:Chart Primary?
+ :closeMatch saogf:Diagram .
+# marc:ActivityCard . # 1 # Primary?
+
+##
+# marc:MusicCompositionType
+
+marc:CanonOrRound # [cn] 18 #
+ :closeMatch . # "Canons (Music)"@en .
+
+marc:Fantasia # [ft] 56 # [also ssb]
+ :closeMatch . # "Fantasias (Music)"@en .
+
+marc:Rondo # [rd] 10 #
+ :closeMatch . # "Rondos"@en .
+
+marc:Rhapsody # [rp] 5 #
+ :closeMatch . # "Rhapsodies (Music)"@en .
+
+marc:Waltz # [wz] 68 #
+ :closeMatch . # "Waltzes (Music)"@en .
+
+marc:Overture # [ov] 70 # [also ssb]
+ :closeMatch . # "Overtures"@en .
+
+marc:Fugue # [fg] 18 #
+ :closeMatch . # "Fugues"@en .
+
+marc:Ricercar # [ri] 1 #
+ :closeMatch . # "Ricercars"@en .
+
+marc:Chaconne # [ca] 3 #
+ :closeMatch . # "Chaconnes"@en .
+
+marc:Oratorio # [or] 54 # [also ssb]
+ :closeMatch . # "Oratorios"@en .
+
+marc:Requiem # [rq] 33 # [also ssb]
+ :closeMatch . # "Requiems"@en .
+
+marc:PartSong # [pt] 62 #
+ :closeMatch . # "Part songs"@en .
+
+marc:Suite # [su] 213 # Primary? [also ssb]
+ :closeMatch . # "Suites"@en .
+
+marc:DanceForm # [df] 99 #
+ :closeMatch . # "Dance music"@en .
+
+marc:Canzona # [cz] 14 #
+ :closeMatch . # "Canzonas (Instrumental music)"@en .
+
+marc:ProgramMusic # [pg] 2 # Primary?
+ :closeMatch . # "Program music"@en .
+
+marc:Minuet # [mi] 8 #
+ :closeMatch . # "Minuets (Music)"@en .
+
+marc:ChantsOtherReligion # [cb] 4 #
+ :closeMatch . # "Chants"@en .
+
+marc:Variation # [vr] 69 #
+ :closeMatch . # "Variations (Music)"@en .
+
+marc:Cantata # [ct] 249 #
+ :closeMatch . # "Cantatas"@en .
+
+marc:Ballad # [bd] 10 #
+ :closeMatch . # "Ballads"@en .
+
+marc:Anthem # [an] 38 # Primary? [also ssb]
+ :closeMatch . # "Anthems"@en .
+
+marc:Nocturne # [nc] 22 #
+ :closeMatch . # "Nocturnes (Music)"@en .
+
+marc:Blues # [bl] 32 # [also ssb]
+ :closeMatch . # "Blues (Music)"@en .
+
+marc:Mass # [ms] 130 #
+ :narrowMatch saogf:Flerst%C3%A4mmiga%20m%C3%A4ssor ;
+ :closeMatch . # "Masses"@en .
+
+marc:Pavan # [pv] 5 #
+ :closeMatch . # "Pavans (Music)"@en .
+
+marc:Hymn # [hy] 39 #
+ :closeMatch . # "Hymns"@en .
+
+marc:DivertimentosSerenadesCassationsDivertissementsNotturni # [dv] 29 #
+ :closeMatch . # "Suites"@en .
+
+marc:Jazz # [jz] 263 # [also ssb]
+ :closeMatch . # "Jazz"@en .
+
+marc:MotionPictureMusic # [mp] 76 # Primary? [also ssb]
+ :closeMatch . # "Motion picture music"@en .
+
+marc:TrioSonata # [ts] 38 #
+ :closeMatch . # "Sonatas"@en .
+
+marc:ChanceComposition # [cs] 19 #
+ :closeMatch . # "Aleatory music"@en .
+
+marc:Flamenco # [fl]
+ :closeMatch . # "Flamenco music"@en .
+
+marc:ChantChristian # [cc] 46 #
+ :closeMatch . # "Chants"@en .
+
+marc:Motet # [mo] 90 #
+ :closeMatch . # "Motets"@en .
+
+marc:Mazurka # [mz] 13 #
+ :closeMatch . # "Mazurkas"@en .
+
+marc:March # [mr] 26 #
+ :closeMatch . # "Marches (Music)"@en .
+
+marc:MusicalRevueOrComedy # [mc] 103 #
+ :closeMatch . # "Revues"@en .
+
+marc:Zarzuela # [za] 1 #
+ :closeMatch . # "Zarzuelas"@en .
+
+marc:ConcertiGrossi # [cg] 19 #
+ :closeMatch . # "Concerti grossi"@en .
+
+marc:CountryMusic # [cy] 21 # [also ssb]
+ :closeMatch . # "Country music"@en .
+
+marc:Carol # [cr] 27 #
+ :closeMatch . # "Carols"@en .
+
+marc:GospelMusic # [gm] 16 #
+ :closeMatch . # "Gospel music"@en .
+
+marc:StudyOrExercise # [st] 282 #
+ :closeMatch . # "Studies (Music)"@en .
+
+marc:Toccata # [tc] 15 #
+ :closeMatch . # "Toccatas"@en .
+
+marc:Concerto # [co] 370 # [also ssb]
+ :closeMatch . # "Concertos"@en .
+
+marc:Villancico # [vi] mismatcing code "vl"?
+ :closeMatch . # "Villancicos (Music)"@en .
+
+marc:SymphonicPoem # [sp] 38 #
+ :closeMatch saogf:Symfoniska%20dikter ;
+ :closeMatch . # "Symphonic poems"@en .
+
+marc:RockMusic # [rc] 250 # [also ssb]
+ :closeMatch . # "Rock music"@en .
+
+marc:Song # [sg] 689 # Primary? [also ssb]
+ :closeMatch . # "Songs"@en .
+
+marc:Passacaglia # [ps] 16 #
+ :closeMatch . # "Passacaglias"@en .
+
+marc:Polonaise # [po] 7 #
+ :closeMatch . # "Polonaises (Music)"@en .
+
+marc:Symphony # [sy] 254 # [also ssb]
+ :closeMatch . # "Symphonies"@en .
+
+marc:Prelude # [pr] 42 # [also ssb]
+ :closeMatch . # "Preludes (Music)"@en .
+
+marc:ChoralePrelude # [cl] 15 #
+ :closeMatch . # "Chorale preludes"@en .
+
+marc:Sonata # [sn] 370 # [also ssb]
+ :closeMatch . # "Sonatas"@en .
+
+marc:Madrigal # [md] 49 #
+ :closeMatch . # "Madrigals (Music)"@en .
+
+marc:SquareDanceMusic # [sd]
+ :closeMatch . # "Square dance music"@en .
+
+marc:Opera # [op] 950 # [also ssb]
+ :closeMatch saogf:Operor ;
+ :closeMatch . # "Operas"@en .
+
+marc:Ballet # [bt] 57 #
+ :closeMatch saogf:Baletter ;
+ :closeMatch . # "Ballets (Music)"@en .
+
+marc:FolkMusic # [fm] 6899 # [also ssb]
+ :closeMatch saogf:Folkmusik ;
+ :closeMatch . # "Folk music"@en .
+
+marc:Chorale # [ch] 11 #
+ :closeMatch saogf:Koraler ;
+ :closeMatch . # "Chorales"@en .
+
+marc:PassionMusic # [pm] 15 #
+ :closeMatch . # "Holy Week music"@en .
+
+marc:BluegrassMusic # [bg] 10 #
+ :closeMatch . # "Bluegrass music"@en .
+
+marc:ChansonsPolyphonic # [cp] 3 #
+ :closeMatch