# AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # @prefix contact: . @prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @prefix xsd: . @prefix dcterms: . @prefix skos: . @prefix vann: . @prefix gufo: . # ============================================================================= # Solid Contacts (address-book) sector ontology — RE-BASED onto gUFO (KEY=contacts). # # v1.0.0 re-base of the v0 thin contacts sector, per R11 §4.2 (the CONTACTS row). # Every sector class now carries its own gUFO meta-type AND rdfs:subClassOf a # re-based Core class (contract rule 2): Contact=gufo:SubKind of core:Record (a # RECORD ABOUT an agent — the card is NOT the agent); the ContactPoint kinds # (Email/Phone/PostalAddress/OnlineHandle)=gufo:SubKind of core:Identifier; # PostalAddress relates to a core:Place; the inter-person link=gufo:Relator # specialising core:Relationship, carrying a relationshipRole core:Category # (colleague/family/friend) and mediating core:RelationshipParty roles; # ContactGroup=gufo:Kind (collective) of core:Group. RelationshipParty is reused # from the Core (core:RelationshipParty = gufo:RoleMixin) — not re-minted. # # AUTHORING PROVENANCE: authored as an OntoUML model (contacts.ontouml.json), # verified anti-pattern-free by OntoumlVerification.verify() (F3, 0 issues), # transformed to a gUFO-OWL backbone by ontouml-js Ontouml2Gufo # (contacts.gufo.ttl), then ENRICHED here with F1 definitions, the Core rooting # (rdfs:subClassOf core:* — the standalone OntoUML model used Core stubs in the # contact: namespace, replaced here by the real core: IRIs), and the property # spine. The ultimate-sortal Core roots (Record/Identifier/Relationship/Group) # could not be specialised inside OntoUML without minting a second ultimate # sortal, so ContactRelationship/ContactGroup are rooted onto core: here. # # CONTRACT (R8 §4 + R11 F1-F7) — admissible because: (1) imports the Core; # (2) every class roots in a Core class and carries its gUFO meta-type; # (3) constrains, never forks; (4) reuses vcard (the canonical contacts vocab) + # schema.org ContactPoint/PostalAddress in the companion contacts-alignments.ttl; # (5) ships contacts.shacl.ttl; (6) carries owl:versionInfo "1.0.0" + a version # IRI (gUFO re-base = new MAJOR — the v0 string core:relationshipRole is REPLACED # by a core:Category + the core:relatesParty mediation); (7) Core ∪ contacts is # DL-valid + reasoner-consistent (see verification report). Open-world by # default; the SHACL profile carries the closed-world MUST/SHOULD. # ============================================================================= a owl:Ontology ; dcterms:title "Solid Contacts Sector Ontology (gUFO re-base)"@en ; rdfs:label "Solid Contacts Sector Ontology"@en ; vann:preferredNamespacePrefix "contact" ; vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/contacts#" ; owl:imports ; owl:versionInfo "1.0.0" ; owl:versionIRI ; dcterms:description """The address-book / contacts sector model for the Solid federation, re-based onto the gUFO Core. A Contact is a core:Record ABOUT a Person or Organization (the card distinct from the agent it names); contact points (email/phone/postal/online) are core:Identifier sub-kinds; the owner-to-contact link is a core:Relationship relator carrying a coded role (colleague/family/friend) and mediating core:RelationshipParty roles; lists are core:Group. v1.0.0 is a BREAKING re-base of v0 (the meta-types and the role model change meaning), so a new MAJOR version. Aligns thoroughly to vcard and to schema:ContactPoint/PostalAddress in the companion alignments file."""@en ; dcterms:modified "2026-06-13"^^xsd:date ; rdfs:comment "Re-based per R11 §4.2."@en . # ----------------------------------------------------------------------------- # Annotation-property declarations (F5: keep the merged closure unambiguously # OWL 2 DL — declare the dcterms:/vann: annotation properties used here). # ----------------------------------------------------------------------------- dcterms:title a owl:AnnotationProperty . dcterms:description a owl:AnnotationProperty . dcterms:modified a owl:AnnotationProperty . vann:preferredNamespacePrefix a owl:AnnotationProperty . vann:preferredNamespaceUri a owl:AnnotationProperty . skos:definition a owl:AnnotationProperty . skos:scopeNote a owl:AnnotationProperty . # ============================================================================= # 1. THE CONTACT CARD (gufo:SubKind of core:Record) # A Contact is the RECORD about an agent, NOT the agent — the Person-vs-Contact # distinction. It is core:about exactly the Person or Organization it names. # ============================================================================= contact:Contact a owl:Class, gufo:SubKind ; rdfs:subClassOf core:Record ; rdfs:label "Contact"@en ; skos:definition "An address-book entry (a card): a core:Record that is core:about exactly the Person or Organization it names. The card is distinct from the real-world agent — reading the card is not being the agent. Aligns to vcard:Kind."@en ; skos:scopeNote "gufo:SubKind of core:Record. Subject via contact:identifies (a sub-property of core:about)."@en . contact:PersonContact a owl:Class, gufo:SubKind ; rdfs:subClassOf contact:Contact ; rdfs:label "Person Contact"@en ; skos:definition "A Contact card whose subject is a core:Person. Aligns to vcard:Individual."@en ; skos:scopeNote "gufo:SubKind of contact:Contact."@en . contact:OrganizationContact a owl:Class, gufo:SubKind ; rdfs:subClassOf contact:Contact ; rdfs:label "Organization Contact"@en ; skos:definition "A Contact card whose subject is a core:Organization. Aligns to vcard:Organization."@en ; skos:scopeNote "gufo:SubKind of contact:Contact."@en . contact:identifies a owl:ObjectProperty ; rdfs:subPropertyOf core:about ; rdfs:domain contact:Contact ; rdfs:range core:Agent ; rdfs:label "identifies"@en ; skos:definition "The Person or Organization a Contact card is about. Sub-property of core:about (range narrowed to core:Agent), never widening it. Keeps card ≠ agent."@en . # ============================================================================= # 2. CONTACT POINTS (gufo:SubKind of core:Identifier — typed channels) # Each locates/identifies the agent within a scheme (RFC 5322 e-mail, E.164 # numbering, a postal scheme). PostalAddress MAY relate to a core:Place. # ============================================================================= contact:ContactPoint a owl:Class, gufo:SubKind ; rdfs:subClassOf core:Identifier ; rdfs:label "Contact Point"@en ; skos:definition "A means of reaching an agent — an email address, phone number, postal address, or online handle. A core:Identifier (it locates the agent within a scheme). Aligns to schema:ContactPoint / the vcard channel value-types."@en ; skos:scopeNote "gufo:SubKind of core:Identifier. Literal value via contact:rawValue (sub-property of core:value)."@en . contact:EmailAddress a owl:Class, gufo:SubKind ; rdfs:subClassOf contact:ContactPoint ; rdfs:label "Email Address"@en ; skos:definition "An e-mail address contact point. Aligns to vcard:Email / schema:email."@en ; skos:scopeNote "gufo:SubKind of contact:ContactPoint."@en . contact:PhoneNumber a owl:Class, gufo:SubKind ; rdfs:subClassOf contact:ContactPoint ; rdfs:label "Phone Number"@en ; skos:definition "A telephone-number contact point. Aligns to vcard:Tel / schema:telephone."@en ; skos:scopeNote "gufo:SubKind of contact:ContactPoint."@en . contact:PostalAddress a owl:Class, gufo:SubKind ; rdfs:subClassOf contact:ContactPoint ; rdfs:label "Postal Address"@en ; skos:definition "A postal/mailing address contact point. core:atPlace MAY relate it to a core:Place for geocoding. Aligns to vcard:Address / schema:PostalAddress."@en ; skos:scopeNote "gufo:SubKind of contact:ContactPoint. Structured parts via contact:streetAddress/locality/region/postalCode/countryName; spatial anchor via core:atPlace."@en . contact:OnlineHandle a owl:Class, gufo:SubKind ; rdfs:subClassOf contact:ContactPoint ; rdfs:label "Online Handle"@en ; skos:definition "A messaging / social handle or URL contact point. Aligns to vcard:hasURL / vcard:hasInstantMessage."@en ; skos:scopeNote "gufo:SubKind of contact:ContactPoint."@en . contact:hasContactPoint a owl:ObjectProperty ; rdfs:subPropertyOf core:identifiedBy ; rdfs:domain contact:Contact ; rdfs:range contact:ContactPoint ; rdfs:label "has contact point"@en ; skos:definition "Relates a Contact to one of its contact points. Sub-property of core:identifiedBy (range narrowed to contact:ContactPoint), never widening it."@en . contact:contactPointType a owl:ObjectProperty ; rdfs:domain contact:ContactPoint ; rdfs:range core:Category ; rdfs:label "contact point type"@en ; skos:definition "The use of a contact point (work / home / mobile / other) as a coded value (core:Category). SHOULD draw from contact:ContactPointTypeScheme; aligns to vcard Work/Home/Cell types."@en . contact:rawValue a owl:DatatypeProperty ; rdfs:subPropertyOf core:value ; rdfs:domain contact:ContactPoint ; rdfs:range xsd:string ; rdfs:label "raw value"@en ; skos:definition "The literal value of a contact point (the address string, the dialable number). Sub-property of core:value, domain narrowed to contact:ContactPoint."@en . # Structured postal-address parts (the schema:PostalAddress / vcard:Address fields) contact:streetAddress a owl:DatatypeProperty ; rdfs:domain contact:PostalAddress ; rdfs:range xsd:string ; rdfs:label "street address"@en ; skos:definition "Street address line(s). vcard:street-address; schema:streetAddress."@en . contact:locality a owl:DatatypeProperty ; rdfs:domain contact:PostalAddress ; rdfs:range xsd:string ; rdfs:label "locality"@en ; skos:definition "City / town. vcard:locality; schema:addressLocality."@en . contact:region a owl:DatatypeProperty ; rdfs:domain contact:PostalAddress ; rdfs:range xsd:string ; rdfs:label "region"@en ; skos:definition "State / province / region. vcard:region; schema:addressRegion."@en . contact:postalCode a owl:DatatypeProperty ; rdfs:domain contact:PostalAddress ; rdfs:range xsd:string ; rdfs:label "postal code"@en ; skos:definition "Postal / ZIP code. vcard:postal-code; schema:postalCode."@en . contact:countryName a owl:DatatypeProperty ; rdfs:domain contact:PostalAddress ; rdfs:range xsd:string ; rdfs:label "country name"@en ; skos:definition "Country name. vcard:country-name; schema:addressCountry."@en . # ============================================================================= # 3. INTER-PERSON LINK (gufo:Relator specialising core:Relationship) # A reified relationship carrying a coded role (colleague/family/friend) and an # optional time span, mediating core:RelationshipParty roles played by the # parties. REPLACES the v0 string core:relationshipRole with a core:Category + # the core:relatesParty mediation. # ============================================================================= contact:ContactRelationship a owl:Class, gufo:Relator ; rdfs:subClassOf core:Relationship ; rdfs:label "Contact Relationship"@en ; skos:definition "A reified relationship between the pod owner (or another agent) and a contacted agent, carrying a coded role (colleague/family/friend) via contact:relationshipRole and an optional core:validFrom/validUntil span. Reuses the Core relationship relator rather than minting a new link type; aligns to vcard:hasRelated / vcard:RelatedType."@en ; skos:scopeNote "gufo:Relator specialising core:Relationship. Mediates ≥2 parties via contact:relatesContact (sub-property of core:relatesParty)."@en . contact:relatesContact a owl:ObjectProperty ; rdfs:subPropertyOf core:relatesParty ; rdfs:domain contact:ContactRelationship ; rdfs:range core:RelationshipParty ; rdfs:label "relates contact"@en ; skos:definition "Mediation tying a ContactRelationship relator to an agent playing the core:RelationshipParty role. Sub-property of core:relatesParty (no widening). Replaces the v0 core:relatesAgent + string core:relationshipRole."@en . contact:relationshipRole a owl:ObjectProperty ; rdfs:domain contact:ContactRelationship ; rdfs:range core:Category ; rdfs:label "relationship role"@en ; skos:definition "The coded role of a ContactRelationship (colleague / family / friend / acquaintance), a core:Category drawn from contact:RelationshipRoleScheme. NOT a sub-property of core:status (that is domain-restricted to core:Account); this is the relationship's own coded classifier. Mirrors vcard:RelatedType members."@en . # Controlled vocabulary of relationship roles — core:Category coded values # (the gUFO non-sortal Mixin bound to skos:Concept in the alignments file, which # also carries the SKOS scheme membership; kept OUT of this DL-reasoned file so # the closure needs no SKOS import). Mirrors vcard:RelatedType members. contact:Colleague a core:Category ; rdfs:label "colleague"@en ; rdfs:comment "Work/professional relationship. vcard:Colleague / vcard:CoWorker."@en . contact:Family a core:Category ; rdfs:label "family"@en ; rdfs:comment "Family relationship. vcard:Kin / vcard:Child / vcard:Parent etc."@en . contact:Friend a core:Category ; rdfs:label "friend"@en ; rdfs:comment "Personal/friend relationship. vcard:Friend."@en . contact:Acquaintance a core:Category ; rdfs:label "acquaintance"@en ; rdfs:comment "Acquaintance relationship. vcard:Acquaintance."@en . # Controlled vocabulary of contact-point types (work/home/mobile/other) — # core:Category coded values (SKOS scheme membership in the alignments file). contact:WorkType a core:Category ; rdfs:label "work"@en ; rdfs:comment "Work/business use. vcard:Work."@en . contact:HomeType a core:Category ; rdfs:label "home"@en ; rdfs:comment "Home/personal use. vcard:Home."@en . contact:MobileType a core:Category ; rdfs:label "mobile"@en ; rdfs:comment "Mobile/cell use. vcard:Cell."@en . # ============================================================================= # 4. ADDRESS-BOOK LISTS / GROUPS (gufo:Kind, collective — specialising core:Group) # ============================================================================= contact:ContactGroup a owl:Class, gufo:Kind ; rdfs:subClassOf core:Group ; rdfs:label "Contact Group"@en ; skos:definition "A named address-book list / distribution group (Friends, Work, Family). A core:Group of the agents its member contacts are about. Aligns to vcard:Group."@en ; skos:scopeNote "gufo:Kind over a collective (a core:Group). Members via contact:hasMemberContact."@en . contact:hasMemberContact a owl:ObjectProperty ; rdfs:domain contact:ContactGroup ; rdfs:range contact:Contact ; rdfs:label "has member contact"@en ; skos:definition "Relates an address-book group/list to a Contact card it includes. Aligns to vcard:hasMember."@en . # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates # in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= a ; rdfs:label "Contacts sector"@en ; rdfs:comment "The Contacts data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over contacts data. Backed by this sector ontology."@en ; rdfs:isDefinedBy ; skos:prefLabel "Contacts"@en .