Quick Reference
This is a list of the changes for each JSON object type and its properties that need to be made when transforming from the JSON data model to the RDF data model.
Where the value of a property is a nested object in JSON, unless otherwise stated, this object is converted into an instance with a relevant rdf:type value, and the value of the property is the URI of this instance (or blank node identifier).
For more detail about the differences, see the Data Model documentation.
Core
Statement
statementId: renamed tostatementIdString; and the value is used for the URI for theStatementinstance.statementDate: unchanged.annotations: becomesannotation.publicationDetails: removed; nested properties are flattened sobodsVersion,license,publicationDateandpublisherare on the Statement. Value ofpublisheris anAgent.source: unchanged.declaration: value is aDeclarationinstance.declarationSubject: moved toDeclarationinstance.recordId: moved to aRecordDetailsinstance and renamed torecordIdString; and the value is used for the URI of theRecordDetailsinstance.recordType: removed; use to generate therdf:typevalue for theRecordDetailsinstance.recordStatus: removed; use to generate therdf:typevalue for theStatementinstance.recordDetails: the value is the URI of aRecordDetailsinstance.
Record details (entity)
These go from a nested object under recordDetails on Statement to an instance with an rdf:type of Entity.
isComponent: removed.entityType: value is an instance of anEntityType(generated from the entityType codelist).entityType/subtype: flattened toentitySubtype; value is an instance of anEntitySubtype(generated from the entitySubtype codelist).entityType/details: flattened toentityTypeDetails.unspecifiedEntityDetails: removed; use an instance ofUnspecifiedRecordinstead.name: unchanged.alternateNames: becomesalternateName.jurisdiction: unchanged.identifiers: becomesidentifier.foundingDate: unchanged.dissolutionDate: unchanged.addresses: becomesaddress.uri: unchanged.publicListing: removed; nested properties are flattened tohasPublicListing,companyFilingsURLandsecuritiesListing.formedByStatute: removed; nested properties are flattened toformedByStatuteNameandformedByStatuteDate.
Record details (person)
These go from a nested object under recordDetails on Statement to an instance with an rdf:type of Person.
isComponent: removed.personType: value is an instance of aPersonType(generated from the personType codelist).unspecifiedPersonDetails: removed; use an instance ofUnspecifiedRecordinstead.names: becomesname.identifiers: becomesidentifier.nationalities: becomesnationality.placeOfBirth: unchanged.birthDate: unchanged.deathDate: unchanged.taxResidencies: becomestaxResidency.addresses: becomesaddress.politicalExposure: value is the identifier for aPoliticalExposureinstance.politicalExposure/status: replaced withpepStatus, the value for which is an instance ofPEPStatus.
Record details (relationship)
These go from a nested object under recordDetails on Statement to an instance with an rdf:type of Relationship.
isComponent: removed.componentRecords: removed.subject: the value goes from a recordId string to the URI of an instance.interestedParty: the value goes from a recordId string to the URI of an instance.interests: becomesinterest; the value goes from a nested object to the URI of an instance.
UnspecifiedRecord
In JSON we use a nested object to describe an unspecified person or entity. This is replaced with the UnspecifiedRecord class which is a subclass of RecordDetails (like Person and Entity).
reason: unchanged; value is an instance from the codelist.description: unchanged.
Interest
type: removed; use ardf:typewith a class.directOrIndirect: unchanged; value is an instance from the codelist.beneficialOwnershipOrControl: unchanged.details: unchanged.share: removed; nested properties are flattened toshareExact,shareMaximum,shareExclusiveMinimum,shareExclusiveMaximum.startDate: unchanged.endDate: unchanged.
Components
Address
type: removed; use ardf:typewith a class.address: renamed tostreetAddress.postCode: unchanged.country: unchanged, but the value is aJurisdiction.
Annotation
statementPointerTarget: unchanged.creationDate: unchanged.createdBy: value is anAgentinstance.motivation: unchanged; value is an instance from the codelist.description: unchanged.transformedContent: unchanged.url: unchanged.
Country
Removed and replaced with Jurisdiction throughout.
Identifier
id: renamed toidString.scheme: unchanged.schemeName: unchanged.uri: unchanged.
Jurisdiction
name: unchanged.code: unchanged.
Name
type: removed; use ardf:typewith a class.fullName: unchanged.familyName: unchanged.givenName: unchanged.patronymicName: unchanged.
PEPstatusDetails
Renamed to PoliticalExposure.
reason: renamed topepStatusReason.missingInfoReason: unchanged.jurisdiction: renamed topepJurisdiction.startDate: unchanged.endDate: unchanged.source: unchanged.
PublicListing
Removed and flattened onto Entity (nested property names unchanged, except for companyFilingsURLs which becomes companyFilingsURL).
PublicationDetails
Removed and flattened onto Statement.
Publisher
Renamed to Agent for use in other places.
name: renamed toagentName.url: renamed toagentUri.
SecuritiesListing
marketIdentifierCode: unchanged.operatingMarketIdentifierCode: unchanged.stockExchangeJurisdiction: unchanged.stockExchangeName: unchanged.security: renamed tosecurityId; convert the nested object into an instance ofSecuritiesIdentifier(which is a subclass ofIdentifierwith the additional property ofticker).
Share
Removed and flattened onto Interest. Note property names are prefixed with share* for clarity.
Source
type: removed; use ardf:typewith a class.description: unchanged.url: unchanged.retrievedAt: unchanged.assertedBy: nested object is replaced withAgentinstance.
Codelists
Where codelists are converted into instances, capitalise the code and prefix it with the namespace https://vocab.openownership.org/codelists# (prefixed codes:) to create a URI. Use this URI as the value where a string of the code would be used in the JSON format. The following codelists are part of the vocabulary as instances:
annotationMotivation: values become instances of theAnnotationMotivationclassdirectOrIndirect: values become instances of theDirectOrIndirectclassentityType: values become instances of theEntityTypeclassentitySubtype: values become instances of theEntitySubtypeclasspersonType: values become instances of thePersonTypeclasssecuritiesIdentifierSchemes: values become instances ofSecuritiesIdentifierSchemeclassunspecifiedReason: values become instances of theUnspecifiedReasonclass
Where codelists are converted into classes, capitalise the code and prefix it with the namespace https://vocab.openownership.org/terms# (prefixed bods:) to create a URI. Use this as the rdf:type value for an instance which, as a JSON object, would have had a property pointing to the string of the code. The following codelists are part of the vocabulary as classes:
addressType: the values become subclasses ofAddressinterestType: the values become subclasses ofInterestnameType: the values become subclasses ofNamerecordStatus: the valuesnew,updatedandclosedare converted toNewRecordStatement,UpdatedRecordStatementandClosedRecordStatementrespectively, as subclasses ofStatement.recordType: the values become as subclasses ofRecordDetails.sourceType: the values become subclasses ofSource