mirror of
https://github.com/datahub-project/datahub.git
synced 2025-11-30 04:34:34 +00:00
1 line
73 KiB
JavaScript
1 line
73 KiB
JavaScript
"use strict";(self.webpackChunkdocs_website=self.webpackChunkdocs_website||[]).push([[10715],{10043:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>y,contentTitle:()=>d,default:()=>h,frontMatter:()=>p,metadata:()=>u,toc:()=>c});n(96540);var a=n(15680),r=n(53720),i=n(5400);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):function(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})),e}function s(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}const p={sidebar_position:40,title:"Structured Property",slug:"/generated/metamodel/entities/structuredproperty",custom_edit_url:"https://github.com/datahub-project/datahub/blob/master/docs/generated/metamodel/entities/structuredProperty.md"},d="Structured Property",u={unversionedId:"docs/generated/metamodel/entities/structuredProperty",id:"docs/generated/metamodel/entities/structuredProperty",title:"Structured Property",description:"Structured Properties are custom, typed metadata fields that can be attached to any entity type in DataHub. They enable organizations to extend the core metadata model with domain-specific attributes that support governance, compliance, and data discovery initiatives.",source:"@site/genDocs/docs/generated/metamodel/entities/structuredProperty.md",sourceDirName:"docs/generated/metamodel/entities",slug:"/generated/metamodel/entities/structuredproperty",permalink:"/docs/generated/metamodel/entities/structuredproperty",draft:!1,editUrl:"https://github.com/datahub-project/datahub/blob/master/docs/generated/metamodel/entities/structuredProperty.md",tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_position:40,title:"Structured Property",slug:"/generated/metamodel/entities/structuredproperty",custom_edit_url:"https://github.com/datahub-project/datahub/blob/master/docs/generated/metamodel/entities/structuredProperty.md"},sidebar:"overviewSidebar",previous:{title:"DataType",permalink:"/docs/generated/metamodel/entities/datatype"},next:{title:"Form",permalink:"/docs/generated/metamodel/entities/form"}},y={},c=[{value:"Identity",id:"identity",level:2},{value:"Important Capabilities",id:"important-capabilities",level:2},{value:"Property Definition",id:"property-definition",level:3},{value:"Type System",id:"type-system",level:4},{value:"Type Qualifiers",id:"type-qualifiers",level:4},{value:"Cardinality",id:"cardinality",level:4},{value:"Entity Type Restrictions",id:"entity-type-restrictions",level:4},{value:"Validation Through Allowed Values",id:"validation-through-allowed-values",level:4},{value:"Immutability",id:"immutability",level:4},{value:"Versioning",id:"versioning",level:4},{value:"Display Settings",id:"display-settings",level:3},{value:"Common Aspects",id:"common-aspects",level:3},{value:"Code Examples",id:"code-examples",level:2},{value:"Create a Structured Property",id:"create-a-structured-property",level:3},{value:"Create a Structured Property with Entity Type Restrictions",id:"create-a-structured-property-with-entity-type-restrictions",level:3},{value:"Apply Structured Properties to Entities",id:"apply-structured-properties-to-entities",level:3},{value:"Patch Operations on Structured Properties",id:"patch-operations-on-structured-properties",level:3},{value:"Query Structured Property Definitions",id:"query-structured-property-definitions",level:3},{value:"Query via REST API",id:"query-via-rest-api",level:3},{value:"Integration Points",id:"integration-points",level:2},{value:"How Structured Properties Relate to Other Entities",id:"how-structured-properties-relate-to-other-entities",level:3},{value:"Applied to Core Data Assets",id:"applied-to-core-data-assets",level:4},{value:"Applied to Organizational Entities",id:"applied-to-organizational-entities",level:4},{value:"Relationship with Forms",id:"relationship-with-forms",level:4},{value:"Search and Discovery",id:"search-and-discovery",level:4},{value:"GraphQL Resolvers",id:"graphql-resolvers",level:4},{value:"Notable Exceptions",id:"notable-exceptions",level:2},{value:"Property Definition Constraints",id:"property-definition-constraints",level:3},{value:"Breaking Changes with Versioning",id:"breaking-changes-with-versioning",level:3},{value:"Soft Delete vs Hard Delete",id:"soft-delete-vs-hard-delete",level:3},{value:"Column-Level Properties",id:"column-level-properties",level:3},{value:"Search Indexing",id:"search-indexing",level:3},{value:"Technical Reference Guide",id:"technical-reference-guide",level:2},{value:"Reading the Field Tables",id:"reading-the-field-tables",level:3},{value:"Aspects",id:"aspects",level:3},{value:"propertyDefinition",id:"propertydefinition",level:4},{value:"structuredPropertySettings",id:"structuredpropertysettings",level:4},{value:"institutionalMemory",id:"institutionalmemory",level:4},{value:"status",id:"status",level:4},{value:"Common Types",id:"common-types",level:3},{value:"AuditStamp",id:"auditstamp",level:4},{value:"Relationships",id:"relationships",level:3},{value:"Outgoing",id:"outgoing",level:4},{value:"Incoming",id:"incoming",level:4},{value:"Global Metadata Model",id:"global-metadata-model",level:3}],m={toc:c},g="wrapper";function h(e){var{components:t}=e,n=s(e,["components"]);return(0,a.yg)(g,o(function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},a=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(a=a.concat(Object.getOwnPropertySymbols(n).filter((function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable})))),a.forEach((function(t){l(e,t,n[t])}))}return e}({},m,n),{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"structured-property"},"Structured Property"),(0,a.yg)("p",null,"Structured Properties are custom, typed metadata fields that can be attached to any entity type in DataHub. They enable organizations to extend the core metadata model with domain-specific attributes that support governance, compliance, and data discovery initiatives."),(0,a.yg)("h2",{id:"identity"},"Identity"),(0,a.yg)("p",null,"Structured Properties are identified by a single piece of information:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"The ",(0,a.yg)("strong",{parentName:"li"},"id")," or ",(0,a.yg)("strong",{parentName:"li"},"qualified name")," of the property: This is a unique string identifier that follows a namespace convention, typically using dot notation (e.g., ",(0,a.yg)("inlineCode",{parentName:"li"},"io.acryl.privacy.retentionTime")," or ",(0,a.yg)("inlineCode",{parentName:"li"},"companyName.department.propertyName"),"). The qualified name becomes part of the URN and must be globally unique across all structured properties in your DataHub instance.")),(0,a.yg)("p",null,"An example of a structured property identifier is ",(0,a.yg)("inlineCode",{parentName:"p"},"urn:li:structuredProperty:io.acryl.privacy.retentionTime"),"."),(0,a.yg)("p",null,"Unlike other entities that may require multiple pieces of information (platform, name, environment), structured properties have a simple, flat identity model based solely on their qualified name."),(0,a.yg)("h2",{id:"important-capabilities"},"Important Capabilities"),(0,a.yg)("h3",{id:"property-definition"},"Property Definition"),(0,a.yg)("p",null,"The core metadata for a structured property is captured in the ",(0,a.yg)("inlineCode",{parentName:"p"},"propertyDefinition")," aspect, which defines:"),(0,a.yg)("h4",{id:"type-system"},"Type System"),(0,a.yg)("p",null,"Structured properties support strongly-typed values through the ",(0,a.yg)("inlineCode",{parentName:"p"},"valueType")," field, which must reference a valid ",(0,a.yg)("inlineCode",{parentName:"p"},"dataType")," entity. The supported types are:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"string"),": Text values (plain text)"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"rich_text"),": Rich text with formatting"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"number"),": Numeric values (integers or decimals)"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"date"),": Date values"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"urn"),": References to other DataHub entities")),(0,a.yg)("p",null,"The type is specified as a URN: ",(0,a.yg)("inlineCode",{parentName:"p"},"urn:li:dataType:datahub.string"),", ",(0,a.yg)("inlineCode",{parentName:"p"},"urn:li:dataType:datahub.number"),", etc."),(0,a.yg)("h4",{id:"type-qualifiers"},"Type Qualifiers"),(0,a.yg)("p",null,"For URN-type properties, you can restrict which entity types are allowed using the ",(0,a.yg)("inlineCode",{parentName:"p"},"typeQualifier")," field. This enables creating properties that reference only specific entity types:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{\n "valueType": "urn:li:dataType:datahub.urn",\n "typeQualifier": {\n "allowedTypes": [\n "urn:li:entityType:datahub.corpuser",\n "urn:li:entityType:datahub.corpGroup"\n ]\n }\n}\n')),(0,a.yg)("h4",{id:"cardinality"},"Cardinality"),(0,a.yg)("p",null,"Structured properties can accept either single or multiple values via the ",(0,a.yg)("inlineCode",{parentName:"p"},"cardinality")," field:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"SINGLE"),": Only one value can be assigned (default)"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"MULTIPLE"),": Multiple values can be assigned as an array")),(0,a.yg)("h4",{id:"entity-type-restrictions"},"Entity Type Restrictions"),(0,a.yg)("p",null,"The ",(0,a.yg)("inlineCode",{parentName:"p"},"entityTypes")," array specifies which entity types this property can be applied to. For example, a property might only be applicable to:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Datasets: ",(0,a.yg)("inlineCode",{parentName:"li"},"urn:li:entityType:datahub.dataset")),(0,a.yg)("li",{parentName:"ul"},"Schema Fields (columns): ",(0,a.yg)("inlineCode",{parentName:"li"},"urn:li:entityType:datahub.schemaField")),(0,a.yg)("li",{parentName:"ul"},"Dashboards: ",(0,a.yg)("inlineCode",{parentName:"li"},"urn:li:entityType:datahub.dashboard")),(0,a.yg)("li",{parentName:"ul"},"Any combination of entity types")),(0,a.yg)("h4",{id:"validation-through-allowed-values"},"Validation Through Allowed Values"),(0,a.yg)("p",null,"To enforce data quality and consistency, you can define a whitelist of acceptable values using the ",(0,a.yg)("inlineCode",{parentName:"p"},"allowedValues")," array. Each allowed value can include:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"value"),": The actual value (string or number)"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"description"),": An explanation of what this value represents")),(0,a.yg)("p",null,"When allowed values are defined, the system validates that any property value assignment matches one of the allowed values."),(0,a.yg)("h4",{id:"immutability"},"Immutability"),(0,a.yg)("p",null,"The ",(0,a.yg)("inlineCode",{parentName:"p"},"immutable")," field (default: ",(0,a.yg)("inlineCode",{parentName:"p"},"false"),") determines whether a property value can be changed once set. When ",(0,a.yg)("inlineCode",{parentName:"p"},"true"),", the property value becomes permanent and cannot be modified or removed, ensuring data integrity for critical metadata."),(0,a.yg)("h4",{id:"versioning"},"Versioning"),(0,a.yg)("p",null,"The ",(0,a.yg)("inlineCode",{parentName:"p"},"version")," field enables breaking schema changes by allowing you to update the property definition in backwards-incompatible ways. Versions must follow the format ",(0,a.yg)("inlineCode",{parentName:"p"},"yyyyMMddhhmmss")," (e.g., ",(0,a.yg)("inlineCode",{parentName:"p"},"20240614080000"),"). When a new version is applied:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Old values with the previous schema become inaccessible"),(0,a.yg)("li",{parentName:"ul"},"New values must conform to the updated schema"),(0,a.yg)("li",{parentName:"ul"},"The old values are subject to asynchronous deletion")),(0,a.yg)("h3",{id:"display-settings"},"Display Settings"),(0,a.yg)("p",null,"The ",(0,a.yg)("inlineCode",{parentName:"p"},"structuredPropertySettings")," aspect controls how properties appear in the DataHub UI:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"isHidden"),": When ",(0,a.yg)("inlineCode",{parentName:"li"},"true"),", the property is not visible in the UI (useful for internal metadata)"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"showInSearchFilters"),": When ",(0,a.yg)("inlineCode",{parentName:"li"},"true"),", users can filter search results by this property's values"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"showInAssetSummary"),": When ",(0,a.yg)("inlineCode",{parentName:"li"},"true"),", displays the property in the asset's sidebar"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"hideInAssetSummaryWhenEmpty"),": When ",(0,a.yg)("inlineCode",{parentName:"li"},"true")," and ",(0,a.yg)("inlineCode",{parentName:"li"},"showInAssetSummary")," is enabled, hides the property from the sidebar when it has no value"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"showAsAssetBadge"),": When ",(0,a.yg)("inlineCode",{parentName:"li"},"true"),", displays the property value as a badge on the asset card (only available for string/number types with allowed values)"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"showInColumnsTable"),": When ",(0,a.yg)("inlineCode",{parentName:"li"},"true"),", displays the property as a column in dataset schema tables (useful for column-level properties)")),(0,a.yg)("h3",{id:"common-aspects"},"Common Aspects"),(0,a.yg)("p",null,"Structured properties also support standard DataHub aspects:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"status"),": Enables soft deletion by setting ",(0,a.yg)("inlineCode",{parentName:"li"},"removed: true"),", which hides the property without deleting underlying data"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"institutionalMemory"),": Allows attaching documentation links explaining the property's purpose and usage"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"deprecation"),": Can mark properties as deprecated while preserving historical data")),(0,a.yg)("h2",{id:"code-examples"},"Code Examples"),(0,a.yg)("h3",{id:"create-a-structured-property"},"Create a Structured Property"),(0,a.yg)("p",null,"This example creates a structured property for tracking data retention time with numeric values and validation:"),(0,a.yg)("details",null,(0,a.yg)("summary",null,"Python SDK: Create a structured property with allowed values"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-python"},'# Inlined from /metadata-ingestion/examples/library/structured_property_create_basic.py\nimport os\n\nfrom datahub.api.entities.structuredproperties.structuredproperties import (\n AllowedValue,\n StructuredProperties,\n)\nfrom datahub.ingestion.graph.client import DataHubGraph, DataHubGraphConfig\n\n# Create a DataHub client\nclient = DataHubGraph(\n DataHubGraphConfig(\n server=os.getenv("DATAHUB_GMS_URL", "http://localhost:8080"),\n token=os.getenv("DATAHUB_GMS_TOKEN"),\n )\n)\n\n# Define a structured property for data retention time\nretention_property = StructuredProperties(\n id="io.acryl.privacy.retentionTime",\n qualified_name="io.acryl.privacy.retentionTime",\n display_name="Retention Time",\n type="number",\n description="Number of days to retain data based on privacy and compliance requirements",\n entity_types=["dataset", "dataFlow"],\n cardinality="SINGLE",\n allowed_values=[\n AllowedValue(\n value=30.0,\n description="30 days - for ephemeral data containing PII",\n ),\n AllowedValue(\n value=90.0,\n description="90 days - for monthly reporting data with PII",\n ),\n AllowedValue(\n value=365.0,\n description="365 days - for non-sensitive data",\n ),\n ],\n)\n\n# Emit the structured property to DataHub\nfor mcp in retention_property.generate_mcps():\n client.emit(mcp)\n\nprint(f"Created structured property: {retention_property.urn}")\n\n'))),(0,a.yg)("h3",{id:"create-a-structured-property-with-entity-type-restrictions"},"Create a Structured Property with Entity Type Restrictions"),(0,a.yg)("p",null,"This example creates a property that accepts URN values but only allows references to users and groups:"),(0,a.yg)("details",null,(0,a.yg)("summary",null,"Python SDK: Create a structured property with type qualifiers"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-python"},'# Inlined from /metadata-ingestion/examples/library/structured_property_create_with_type_qualifier.py\nfrom datahub.api.entities.structuredproperties.structuredproperties import (\n StructuredProperties,\n TypeQualifierAllowedTypes,\n)\nfrom datahub.ingestion.graph.client import DatahubClientConfig, DataHubGraph\n\n# Create a DataHub client\nclient = DataHubGraph(DatahubClientConfig(server="http://localhost:8080"))\n\n# Define a structured property that references DataHub entities\n# This property can only reference CorpUser or CorpGroup entities\ndata_steward_property = StructuredProperties(\n id="io.acryl.governance.dataSteward",\n qualified_name="io.acryl.governance.dataSteward",\n display_name="Data Steward",\n type="urn",\n description="The designated data steward responsible for this asset\'s governance and quality",\n entity_types=["dataset", "dashboard", "chart", "dataJob"],\n cardinality="SINGLE",\n type_qualifier=TypeQualifierAllowedTypes(\n allowed_types=[\n "urn:li:entityType:datahub.corpuser",\n "urn:li:entityType:datahub.corpGroup",\n ]\n ),\n)\n\n# Emit the structured property to DataHub\nfor mcp in data_steward_property.generate_mcps():\n client.emit_mcp(mcp)\n\nprint(f"Created structured property: {data_steward_property.urn}")\n\n# Example: Create a multi-value property for related datasets\nrelated_datasets_property = StructuredProperties(\n id="io.acryl.lineage.relatedDatasets",\n qualified_name="io.acryl.lineage.relatedDatasets",\n display_name="Related Datasets",\n type="urn",\n description="Other datasets that are semantically or functionally related to this asset",\n entity_types=["dataset"],\n cardinality="MULTIPLE",\n type_qualifier=TypeQualifierAllowedTypes(\n allowed_types=["urn:li:entityType:datahub.dataset"]\n ),\n)\n\n# Emit the second structured property\nfor mcp in related_datasets_property.generate_mcps():\n client.emit_mcp(mcp)\n\nprint(f"Created structured property: {related_datasets_property.urn}")\n\n'))),(0,a.yg)("h3",{id:"apply-structured-properties-to-entities"},"Apply Structured Properties to Entities"),(0,a.yg)("p",null,"Once structured properties are defined, you can assign them to entities:"),(0,a.yg)("details",null,(0,a.yg)("summary",null,"Python SDK: Apply structured properties to a dataset"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-python"},'# Inlined from /metadata-ingestion/examples/library/dataset_update_structured_properties.py\nimport logging\n\nfrom datahub.emitter.mce_builder import make_dataset_urn\nfrom datahub.emitter.rest_emitter import DataHubRestEmitter\nfrom datahub.specific.dataset import DatasetPatchBuilder\n\nlog = logging.getLogger(__name__)\nlogging.basicConfig(level=logging.INFO)\n\n# Create rest emitter\nrest_emitter = DataHubRestEmitter(gms_server="http://localhost:8080")\n\ndataset_urn = make_dataset_urn(platform="hive", name="fct_users_created", env="PROD")\n\n\nfor patch_mcp in (\n DatasetPatchBuilder(dataset_urn)\n .set_structured_property("io.acryl.dataManagement.replicationSLA", 120)\n .build()\n):\n rest_emitter.emit(patch_mcp)\n\n\nlog.info(f"Added cluster_name, retention_time properties to dataset {dataset_urn}")\n\n'))),(0,a.yg)("h3",{id:"patch-operations-on-structured-properties"},"Patch Operations on Structured Properties"),(0,a.yg)("p",null,"For more granular control, use patch operations to add or remove individual properties:"),(0,a.yg)("details",null,(0,a.yg)("summary",null,"Python SDK: Add and remove structured properties using patches"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-python"},'# Inlined from /metadata-ingestion/examples/library/dataset_add_structured_properties_patch.py\nfrom datahub.emitter.mce_builder import make_dataset_urn\nfrom datahub.ingestion.graph.client import DataHubGraph, DataHubGraphConfig\nfrom datahub.specific.dataset import DatasetPatchBuilder\n\n# Create DataHub Client\ndatahub_client = DataHubGraph(DataHubGraphConfig(server="http://localhost:8080"))\n\n# Create Dataset URN\ndataset_urn = make_dataset_urn(platform="hive", name="fct_users_created", env="PROD")\n\n# Create Dataset Patch to Add and Remove Structured Properties\npatch_builder = DatasetPatchBuilder(dataset_urn)\npatch_builder.add_structured_property(\n "urn:li:structuredProperty:retentionTimeInDays", 12\n)\npatch_builder.remove_structured_property(\n "urn:li:structuredProperty:customClassification"\n)\npatch_mcps = patch_builder.build()\n\n# Emit Dataset Patch\nfor patch_mcp in patch_mcps:\n datahub_client.emit(patch_mcp)\n\n'))),(0,a.yg)("h3",{id:"query-structured-property-definitions"},"Query Structured Property Definitions"),(0,a.yg)("p",null,"Retrieve structured property definitions to understand their configuration:"),(0,a.yg)("details",null,(0,a.yg)("summary",null,"Python SDK: Query a structured property"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-python"},'# Inlined from /metadata-ingestion/examples/library/structured_property_query.py\nfrom datahub.api.entities.structuredproperties.structuredproperties import (\n StructuredProperties,\n)\nfrom datahub.ingestion.graph.client import DatahubClientConfig, DataHubGraph\n\n# Create a DataHub client\nclient = DataHubGraph(DatahubClientConfig(server="http://localhost:8080"))\n\n# List all structured properties in the system\nprint("Listing all structured properties:")\nprint("-" * 80)\n\nfor structured_property in StructuredProperties.list(client):\n print(f"\\nURN: {structured_property.urn}")\n print(f"Display Name: {structured_property.display_name}")\n print(f"Type: {structured_property.type}")\n print(f"Cardinality: {structured_property.cardinality}")\n print(f"Entity Types: {\', \'.join(structured_property.entity_types or [])}")\n\n if structured_property.allowed_values:\n print("Allowed Values:")\n for av in structured_property.allowed_values:\n print(f" - {av.value}: {av.description}")\n\n# Retrieve a specific structured property by URN\nprint("\\n" + "=" * 80)\nprint("Retrieving specific structured property:")\nprint("-" * 80)\n\nproperty_urn = "urn:li:structuredProperty:io.acryl.privacy.retentionTime"\n\ntry:\n specific_property = StructuredProperties.from_datahub(client, property_urn)\n\n print(f"\\nURN: {specific_property.urn}")\n print(f"Qualified Name: {specific_property.qualified_name}")\n print(f"Display Name: {specific_property.display_name}")\n print(f"Description: {specific_property.description}")\n print(f"Type: {specific_property.type}")\n print(f"Cardinality: {specific_property.cardinality}")\n print(f"Immutable: {specific_property.immutable}")\n print(f"Entity Types: {\', \'.join(specific_property.entity_types or [])}")\n\n if specific_property.allowed_values:\n print("\\nAllowed Values:")\n for av in specific_property.allowed_values:\n print(f" - {av.value}: {av.description}")\n\n if specific_property.type_qualifier:\n print("\\nType Qualifier - Allowed Entity Types:")\n for entity_type in specific_property.type_qualifier.allowed_types:\n print(f" - {entity_type}")\n\nexcept Exception as e:\n print(f"Error retrieving structured property: {e}")\n\n# Example: List just the URNs (for scripting)\nprint("\\n" + "=" * 80)\nprint("All structured property URNs:")\nprint("-" * 80)\n\nfor urn in StructuredProperties.list_urns(client):\n print(urn)\n\n'))),(0,a.yg)("h3",{id:"query-via-rest-api"},"Query via REST API"),(0,a.yg)("p",null,"You can also retrieve structured property definitions using the REST API:"),(0,a.yg)("details",null,(0,a.yg)("summary",null,"REST API: Get structured property definition"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"curl -X 'GET' \\\n 'http://localhost:8080/openapi/v3/entity/structuredProperty/urn%3Ali%3AstructuredProperty%3Aio.acryl.privacy.retentionTime/propertyDefinition' \\\n -H 'accept: application/json'\n")),(0,a.yg)("p",null,"Example Response:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{\n "urn": "urn:li:structuredProperty:io.acryl.privacy.retentionTime",\n "propertyDefinition": {\n "value": {\n "qualifiedName": "io.acryl.privacy.retentionTime",\n "displayName": "Retention Time",\n "valueType": "urn:li:dataType:datahub.number",\n "description": "Number of days to retain data",\n "entityTypes": ["urn:li:entityType:datahub.dataset"],\n "cardinality": "SINGLE",\n "allowedValues": [\n {\n "value": { "double": 30 },\n "description": "30 days for ephemeral data"\n },\n {\n "value": { "double": 90 },\n "description": "90 days for regular data"\n }\n ]\n }\n }\n}\n'))),(0,a.yg)("h2",{id:"integration-points"},"Integration Points"),(0,a.yg)("h3",{id:"how-structured-properties-relate-to-other-entities"},"How Structured Properties Relate to Other Entities"),(0,a.yg)("p",null,"Structured properties enable flexible metadata extension across the entire DataHub ecosystem:"),(0,a.yg)("h4",{id:"applied-to-core-data-assets"},"Applied to Core Data Assets"),(0,a.yg)("p",null,"Structured properties can be attached to any core data asset:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Datasets"),": Track data quality metrics, retention policies, or compliance classifications"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Schema Fields"),": Add business glossary terms, sensitivity labels, or validation rules at the column level"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Charts and Dashboards"),": Capture certification status, review dates, or usage guidelines"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Data Jobs and Pipelines"),": Record SLA requirements, criticality levels, or maintenance schedules")),(0,a.yg)("h4",{id:"applied-to-organizational-entities"},"Applied to Organizational Entities"),(0,a.yg)("p",null,"Properties also extend to organizational and governance entities:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Domains"),": Track ownership model, maturity level, or strategic importance"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Glossary Terms"),": Add approval status, version numbers, or related regulations"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Data Products"),": Capture product lifecycle stage, target audience, or support tier"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Users and Groups"),": Store employee IDs, cost centers, or access review dates")),(0,a.yg)("h4",{id:"relationship-with-forms"},"Relationship with Forms"),(0,a.yg)("p",null,"Structured properties work in conjunction with DataHub Forms to enable:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Compliance workflows"),": Forms can collect structured property values to ensure policy compliance"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Bulk updates"),": Forms allow updating structured properties across multiple assets simultaneously"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Validation"),": Forms enforce property constraints during data collection")),(0,a.yg)("h4",{id:"search-and-discovery"},"Search and Discovery"),(0,a.yg)("p",null,"Structured properties enhance search capabilities:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Properties marked with ",(0,a.yg)("inlineCode",{parentName:"li"},"showInSearchFilters: true")," become available as faceted search filters"),(0,a.yg)("li",{parentName:"ul"},"Users can filter results by property values to find assets meeting specific criteria"),(0,a.yg)("li",{parentName:"ul"},"Aggregation queries can summarize property value distributions across your data landscape")),(0,a.yg)("h4",{id:"graphql-resolvers"},"GraphQL Resolvers"),(0,a.yg)("p",null,"The GraphQL layer exposes structured properties through several resolvers:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"CreateStructuredPropertyResolver"),": Creates new structured property definitions"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"UpdateStructuredPropertyResolver"),": Modifies existing property definitions (within allowed constraints)"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"DeleteStructuredPropertyResolver"),": Removes structured property definitions"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"UpsertStructuredPropertiesResolver"),": Assigns property values to entities"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"RemoveStructuredPropertiesResolver"),": Removes property values from entities")),(0,a.yg)("p",null,"These resolvers are located in ",(0,a.yg)("inlineCode",{parentName:"p"},"/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/structuredproperties/"),"."),(0,a.yg)("h2",{id:"notable-exceptions"},"Notable Exceptions"),(0,a.yg)("h3",{id:"property-definition-constraints"},"Property Definition Constraints"),(0,a.yg)("p",null,"Once a structured property is created and in use, certain fields cannot be modified to prevent data inconsistency:"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Immutable Fields:")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"valueType"),": Cannot change the data type (e.g., from string to number)"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"allowedValues"),": Cannot remove or modify existing allowed values (can only add new ones)"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"cardinality"),": Cannot change between SINGLE and MULTIPLE without a version bump")),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modifiable Fields:")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"displayName"),": Can be updated for better readability"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"description"),": Can be enhanced or clarified"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"entityTypes"),": Can add new entity types (but not remove existing ones)"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"allowedValues"),": Can append additional allowed values"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Display settings"),": All ",(0,a.yg)("inlineCode",{parentName:"li"},"structuredPropertySettings")," can be freely modified")),(0,a.yg)("h3",{id:"breaking-changes-with-versioning"},"Breaking Changes with Versioning"),(0,a.yg)("p",null,"To make backwards-incompatible changes (like changing cardinality or removing allowed values), you must:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Set a new ",(0,a.yg)("inlineCode",{parentName:"li"},"version")," value in format ",(0,a.yg)("inlineCode",{parentName:"li"},"yyyyMMddhhmmss")),(0,a.yg)("li",{parentName:"ol"},"Apply the updated definition"),(0,a.yg)("li",{parentName:"ol"},"Accept that old values will become inaccessible"),(0,a.yg)("li",{parentName:"ol"},"Re-apply property values with the new schema")),(0,a.yg)("p",null,"This is a destructive operation and should be carefully planned."),(0,a.yg)("h3",{id:"soft-delete-vs-hard-delete"},"Soft Delete vs Hard Delete"),(0,a.yg)("p",null,"Structured properties support two deletion modes:"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Soft Delete")," (via ",(0,a.yg)("inlineCode",{parentName:"p"},"status")," aspect with ",(0,a.yg)("inlineCode",{parentName:"p"},"removed: true"),"):"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Property definition remains in the system"),(0,a.yg)("li",{parentName:"ul"},"Property values are hidden but not deleted"),(0,a.yg)("li",{parentName:"ul"},"Assignment of new values is blocked"),(0,a.yg)("li",{parentName:"ul"},"Search filters using the property are disabled"),(0,a.yg)("li",{parentName:"ul"},"Fully reversible by setting ",(0,a.yg)("inlineCode",{parentName:"li"},"removed: false"))),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Hard Delete")," (via entity deletion):"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Removes the property definition entity completely"),(0,a.yg)("li",{parentName:"ul"},"Triggers asynchronous removal of all property values across all entities"),(0,a.yg)("li",{parentName:"ul"},"Not reversible"),(0,a.yg)("li",{parentName:"ul"},"Elasticsearch mappings persist until reindexing occurs")),(0,a.yg)("h3",{id:"column-level-properties"},"Column-Level Properties"),(0,a.yg)("p",null,"When creating properties for schema fields (columns), be aware:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Setting ",(0,a.yg)("inlineCode",{parentName:"li"},"showInColumnsTable: true")," displays the property in all dataset schema views"),(0,a.yg)("li",{parentName:"ul"},"Column-level properties automatically appear in the column sidebar"),(0,a.yg)("li",{parentName:"ul"},"Too many visible properties can clutter the UI, so use display settings judiciously")),(0,a.yg)("h3",{id:"search-indexing"},"Search Indexing"),(0,a.yg)("p",null,"Structured property values are indexed in Elasticsearch using a special naming convention:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Unversioned"),": ",(0,a.yg)("inlineCode",{parentName:"li"},"structuredProperties.io_acryl_privacy_retentionTime")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Versioned"),": ",(0,a.yg)("inlineCode",{parentName:"li"},"structuredProperties._versioned.io_acryl_privacy_retentionTime02.20240614080000.string"))),(0,a.yg)("p",null,"Understanding this convention is important for:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Advanced search queries using the OpenAPI"),(0,a.yg)("li",{parentName:"ul"},"Debugging search issues"),(0,a.yg)("li",{parentName:"ul"},"Creating custom aggregations")),(0,a.yg)("p",null,"For more information, refer to:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/docs/features/feature-guides/properties/overview"},"Structured Properties Feature Guide")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/docs/api/tutorials/structured-properties"},"Structured Properties API Tutorial"))),(0,a.yg)("h2",{id:"technical-reference-guide"},"Technical Reference Guide"),(0,a.yg)("p",null,"The sections above provide an overview of how to use this entity. The following sections provide detailed technical information about how metadata is stored and represented in DataHub."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Aspects")," are the individual pieces of metadata that can be attached to an entity. Each aspect contains specific information (like ownership, tags, or properties) and is stored as a separate record, allowing for flexible and incremental metadata updates."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Relationships")," show how this entity connects to other entities in the metadata graph. These connections are derived from the fields within each aspect and form the foundation of DataHub's knowledge graph."),(0,a.yg)("h3",{id:"reading-the-field-tables"},"Reading the Field Tables"),(0,a.yg)("p",null,"Each aspect's field table includes an ",(0,a.yg)("strong",{parentName:"p"},"Annotations")," column that provides additional metadata about how fields are used:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"\u26a0\ufe0f Deprecated"),": This field is deprecated and may be removed in a future version. Check the description for the recommended alternative"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Searchable"),": This field is indexed and can be searched in DataHub's search interface"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Searchable (fieldname)"),": When the field name in parentheses is shown, it indicates the field is indexed under a different name in the search index. For example, ",(0,a.yg)("inlineCode",{parentName:"li"},"dashboardTool")," is indexed as ",(0,a.yg)("inlineCode",{parentName:"li"},"tool")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"\u2192 RelationshipName"),": This field creates a relationship to another entity. The arrow indicates this field contains a reference (URN) to another entity, and the name indicates the type of relationship (e.g., ",(0,a.yg)("inlineCode",{parentName:"li"},"\u2192 Contains"),", ",(0,a.yg)("inlineCode",{parentName:"li"},"\u2192 OwnedBy"),")")),(0,a.yg)("p",null,"Fields with complex types (like ",(0,a.yg)("inlineCode",{parentName:"p"},"Edge"),", ",(0,a.yg)("inlineCode",{parentName:"p"},"AuditStamp"),") link to their definitions in the ",(0,a.yg)("a",{parentName:"p",href:"#common-types"},"Common Types")," section below."),(0,a.yg)("h3",{id:"aspects"},"Aspects"),(0,a.yg)("h4",{id:"propertydefinition"},"propertyDefinition"),(0,a.yg)("p",null,"None"),(0,a.yg)(r.A,{mdxType:"Tabs"},(0,a.yg)(i.A,{value:"fields",label:"Fields",default:!0,mdxType:"TabItem"},(0,a.yg)("table",null,(0,a.yg)("thead",{parentName:"table"},(0,a.yg)("tr",{parentName:"thead"},(0,a.yg)("th",{parentName:"tr",align:null},"Field"),(0,a.yg)("th",{parentName:"tr",align:null},"Type"),(0,a.yg)("th",{parentName:"tr",align:null},"Required"),(0,a.yg)("th",{parentName:"tr",align:null},"Description"),(0,a.yg)("th",{parentName:"tr",align:null},"Annotations"))),(0,a.yg)("tbody",{parentName:"table"},(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"qualifiedName"),(0,a.yg)("td",{parentName:"tr",align:null},"string"),(0,a.yg)("td",{parentName:"tr",align:null},"\u2713"),(0,a.yg)("td",{parentName:"tr",align:null},"The fully qualified name of the property. e.g. io.acryl.datahub.myProperty"),(0,a.yg)("td",{parentName:"tr",align:null},"Searchable")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"displayName"),(0,a.yg)("td",{parentName:"tr",align:null},"string"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"The display name of the property. This is the name that will be shown in the UI and can be used t..."),(0,a.yg)("td",{parentName:"tr",align:null},"Searchable")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"valueType"),(0,a.yg)("td",{parentName:"tr",align:null},"string"),(0,a.yg)("td",{parentName:"tr",align:null},"\u2713"),(0,a.yg)("td",{parentName:"tr",align:null},"The value type of the property. Must be a dataType. e.g. To indicate that the property is of type..."),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"typeQualifier"),(0,a.yg)("td",{parentName:"tr",align:null},"map"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"A map that allows for type specialization of the valueType. e.g. a valueType of urn:li:dataType:d..."),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"allowedValues"),(0,a.yg)("td",{parentName:"tr",align:null},"PropertyValue[]"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"A list of allowed values that the property is allowed to take. If this is not specified, then th..."),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"cardinality"),(0,a.yg)("td",{parentName:"tr",align:null},"PropertyCardinality"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"The cardinality of the property. If not specified, then the property is assumed to be single valu..."),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"entityTypes"),(0,a.yg)("td",{parentName:"tr",align:null},"string[]"),(0,a.yg)("td",{parentName:"tr",align:null},"\u2713"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"Searchable, \u2192 StructuredPropertyOf")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"description"),(0,a.yg)("td",{parentName:"tr",align:null},"string"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"The description of the property. This is the description that will be shown in the UI."),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"searchConfiguration"),(0,a.yg)("td",{parentName:"tr",align:null},"DataHubSearchConfig"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"Search configuration for this property. If not specified, then the property is indexed using the ..."),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"immutable"),(0,a.yg)("td",{parentName:"tr",align:null},"boolean"),(0,a.yg)("td",{parentName:"tr",align:null},"\u2713"),(0,a.yg)("td",{parentName:"tr",align:null},"Whether the structured property value is immutable once applied to an entity."),(0,a.yg)("td",{parentName:"tr",align:null},"Searchable")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"version"),(0,a.yg)("td",{parentName:"tr",align:null},"string"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"Definition version - Allows breaking schema changes. String is compared case-insensitive and new ..."),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"created"),(0,a.yg)("td",{parentName:"tr",align:null},(0,a.yg)("a",{parentName:"td",href:"#auditstamp"},"AuditStamp")),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"Created Audit stamp"),(0,a.yg)("td",{parentName:"tr",align:null},"Searchable")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"lastModified"),(0,a.yg)("td",{parentName:"tr",align:null},(0,a.yg)("a",{parentName:"td",href:"#auditstamp"},"AuditStamp")),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"Last Modified Audit stamp"),(0,a.yg)("td",{parentName:"tr",align:null},"Searchable"))))),(0,a.yg)(i.A,{value:"raw",label:"Raw Schema",mdxType:"TabItem"},(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-javascript"},'{\n "type": "record",\n "Aspect": {\n "name": "propertyDefinition"\n },\n "name": "StructuredPropertyDefinition",\n "namespace": "com.linkedin.structured",\n "fields": [\n {\n "Searchable": {\n "fieldType": "KEYWORD",\n "searchLabel": "qualifiedName",\n "searchTier": 1\n },\n "type": "string",\n "name": "qualifiedName",\n "doc": "The fully qualified name of the property. e.g. io.acryl.datahub.myProperty"\n },\n {\n "Searchable": {\n "enableAutocomplete": true,\n "fieldType": "WORD_GRAM",\n "searchLabel": "entityName",\n "searchTier": 1\n },\n "type": [\n "null",\n "string"\n ],\n "name": "displayName",\n "default": null,\n "doc": "The display name of the property. This is the name that will be shown in the UI and can be used to look up the property id."\n },\n {\n "UrnValidation": {\n "entityTypes": [\n "dataType"\n ],\n "exist": true,\n "strict": true\n },\n "java": {\n "class": "com.linkedin.common.urn.Urn"\n },\n "type": "string",\n "name": "valueType",\n "doc": "The value type of the property. Must be a dataType.\\ne.g. To indicate that the property is of type DATE, use urn:li:dataType:datahub.date"\n },\n {\n "type": [\n "null",\n {\n "type": "map",\n "values": {\n "type": "array",\n "items": "string"\n }\n }\n ],\n "name": "typeQualifier",\n "default": null,\n "doc": "A map that allows for type specialization of the valueType.\\ne.g. a valueType of urn:li:dataType:datahub.urn\\ncan be specialized to be a USER or GROUP URN by adding a typeQualifier like \\n{ \\"allowedTypes\\": [\\"urn:li:entityType:datahub.corpuser\\", \\"urn:li:entityType:datahub.corpGroup\\"] }"\n },\n {\n "type": [\n "null",\n {\n "type": "array",\n "items": {\n "type": "record",\n "name": "PropertyValue",\n "namespace": "com.linkedin.structured",\n "fields": [\n {\n "type": [\n "string",\n "double"\n ],\n "name": "value"\n },\n {\n "type": [\n "null",\n "string"\n ],\n "name": "description",\n "default": null,\n "doc": "Optional description of the property value"\n }\n ]\n }\n }\n ],\n "name": "allowedValues",\n "default": null,\n "doc": "A list of allowed values that the property is allowed to take. \\nIf this is not specified, then the property can take any value of given type."\n },\n {\n "type": [\n {\n "type": "enum",\n "name": "PropertyCardinality",\n "namespace": "com.linkedin.structured",\n "symbols": [\n "SINGLE",\n "MULTIPLE"\n ]\n },\n "null"\n ],\n "name": "cardinality",\n "default": "SINGLE",\n "doc": "The cardinality of the property. If not specified, then the property is assumed to be single valued.."\n },\n {\n "Relationship": {\n "/*": {\n "entityTypes": [\n "entityType"\n ],\n "name": "StructuredPropertyOf"\n }\n },\n "Searchable": {\n "/*": {\n "fieldName": "entityTypes"\n }\n },\n "UrnValidation": {\n "entityTypes": [\n "entityType"\n ],\n "exist": true,\n "strict": true\n },\n "type": {\n "type": "array",\n "items": "string"\n },\n "name": "entityTypes"\n },\n {\n "type": [\n "null",\n "string"\n ],\n "name": "description",\n "default": null,\n "doc": "The description of the property. This is the description that will be shown in the UI."\n },\n {\n "type": [\n "null",\n {\n "type": "record",\n "name": "DataHubSearchConfig",\n "namespace": "com.linkedin.datahub",\n "fields": [\n {\n "type": [\n "null",\n "string"\n ],\n "name": "fieldName",\n "default": null,\n "doc": "Name of the field in the search index. Defaults to the field name otherwise"\n },\n {\n "type": [\n "null",\n {\n "type": "enum",\n "name": "SearchFieldType",\n "namespace": "com.linkedin.datahub",\n "symbols": [\n "KEYWORD",\n "TEXT",\n "TEXT_PARTIAL",\n "BROWSE_PATH",\n "URN",\n "URN_PARTIAL",\n "BOOLEAN",\n "COUNT",\n "DATETIME",\n "OBJECT",\n "BROWSE_PATH_V2",\n "WORD_GRAM"\n ]\n }\n ],\n "name": "fieldType",\n "default": null,\n "doc": "Type of the field. Defines how the field is indexed and matched"\n },\n {\n "type": "boolean",\n "name": "queryByDefault",\n "default": false,\n "doc": "Whether we should match the field for the default search query"\n },\n {\n "type": "boolean",\n "name": "enableAutocomplete",\n "default": false,\n "doc": "Whether we should use the field for default autocomplete"\n },\n {\n "type": "boolean",\n "name": "addToFilters",\n "default": false,\n "doc": "Whether or not to add field to filters."\n },\n {\n "type": "boolean",\n "name": "addHasValuesToFilters",\n "default": true,\n "doc": "Whether or not to add the \\"has values\\" to filters.\\ncheck if this is conditional on addToFilters being true"\n },\n {\n "type": [\n "null",\n "string"\n ],\n "name": "filterNameOverride",\n "default": null,\n "doc": "Display name of the filter"\n },\n {\n "type": [\n "null",\n "string"\n ],\n "name": "hasValuesFilterNameOverride",\n "default": null,\n "doc": "Display name of the has values filter"\n },\n {\n "type": "double",\n "name": "boostScore",\n "default": 1.0,\n "doc": "Boost multiplier to the match score. Matches on fields with higher boost score ranks higher"\n },\n {\n "type": [\n "null",\n "string"\n ],\n "name": "hasValuesFieldName",\n "default": null,\n "doc": "If set, add a index field of the given name that checks whether the field exists"\n },\n {\n "type": [\n "null",\n "string"\n ],\n "name": "numValuesFieldName",\n "default": null,\n "doc": "If set, add a index field of the given name that checks the number of elements"\n },\n {\n "type": [\n "null",\n {\n "type": "map",\n "values": "double"\n }\n ],\n "name": "weightsPerFieldValue",\n "default": null,\n "doc": "(Optional) Weights to apply to score for a given value"\n },\n {\n "type": [\n "null",\n {\n "type": "array",\n "items": "string"\n }\n ],\n "name": "fieldNameAliases",\n "default": null,\n "doc": "(Optional) Aliases for this given field that can be used for sorting etc."\n }\n ],\n "doc": "Configuration for how any given field should be indexed and matched in the DataHub search index."\n }\n ],\n "name": "searchConfiguration",\n "default": null,\n "doc": "Search configuration for this property. If not specified, then the property is indexed using the default mapping.\\nfrom the logical type."\n },\n {\n "Searchable": {\n "fieldType": "BOOLEAN"\n },\n "type": "boolean",\n "name": "immutable",\n "default": false,\n "doc": "Whether the structured property value is immutable once applied to an entity."\n },\n {\n "type": [\n "null",\n "string"\n ],\n "name": "version",\n "default": null,\n "doc": "Definition version - Allows breaking schema changes. String is compared case-insensitive and new\\n versions must be monotonically increasing. Cannot use periods/dots.\\n Suggestions: v1, v2\\n 20240610, 20240611"\n },\n {\n "Searchable": {\n "/time": {\n "fieldName": "createdTime",\n "fieldType": "DATETIME",\n "searchLabel": "createdAt"\n }\n },\n "type": [\n "null",\n {\n "type": "record",\n "name": "AuditStamp",\n "namespace": "com.linkedin.common",\n "fields": [\n {\n "type": "long",\n "name": "time",\n "doc": "When did the resource/association/sub-resource move into the specific lifecycle stage represented by this AuditEvent."\n },\n {\n "java": {\n "class": "com.linkedin.common.urn.Urn"\n },\n "type": "string",\n "name": "actor",\n "doc": "The entity (e.g. a member URN) which will be credited for moving the resource/association/sub-resource into the specific lifecycle stage. It is also the one used to authorize the change."\n },\n {\n "java": {\n "class": "com.linkedin.common.urn.Urn"\n },\n "type": [\n "null",\n "string"\n ],\n "name": "impersonator",\n "default": null,\n "doc": "The entity (e.g. a service URN) which performs the change on behalf of the Actor and must be authorized to act as the Actor."\n },\n {\n "type": [\n "null",\n "string"\n ],\n "name": "message",\n "default": null,\n "doc": "Additional context around how DataHub was informed of the particular change. For example: was the change created by an automated process, or manually."\n }\n ],\n "doc": "Data captured on a resource/association/sub-resource level giving insight into when that resource/association/sub-resource moved into a particular lifecycle stage, and who acted to move it into that specific lifecycle stage."\n }\n ],\n "name": "created",\n "default": null,\n "doc": "Created Audit stamp"\n },\n {\n "Searchable": {\n "/time": {\n "fieldName": "lastModified",\n "fieldType": "DATETIME",\n "searchLabel": "lastModifiedAt"\n }\n },\n "type": [\n "null",\n "com.linkedin.common.AuditStamp"\n ],\n "name": "lastModified",\n "default": null,\n "doc": "Last Modified Audit stamp"\n }\n ]\n}\n')))),(0,a.yg)("h4",{id:"structuredpropertysettings"},"structuredPropertySettings"),(0,a.yg)("p",null,"Settings specific to a structured property entity"),(0,a.yg)(r.A,{mdxType:"Tabs"},(0,a.yg)(i.A,{value:"fields",label:"Fields",default:!0,mdxType:"TabItem"},(0,a.yg)("table",null,(0,a.yg)("thead",{parentName:"table"},(0,a.yg)("tr",{parentName:"thead"},(0,a.yg)("th",{parentName:"tr",align:null},"Field"),(0,a.yg)("th",{parentName:"tr",align:null},"Type"),(0,a.yg)("th",{parentName:"tr",align:null},"Required"),(0,a.yg)("th",{parentName:"tr",align:null},"Description"),(0,a.yg)("th",{parentName:"tr",align:null},"Annotations"))),(0,a.yg)("tbody",{parentName:"table"},(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"isHidden"),(0,a.yg)("td",{parentName:"tr",align:null},"boolean"),(0,a.yg)("td",{parentName:"tr",align:null},"\u2713"),(0,a.yg)("td",{parentName:"tr",align:null},"Whether or not this asset should be hidden in the main application"),(0,a.yg)("td",{parentName:"tr",align:null},"Searchable")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"showInSearchFilters"),(0,a.yg)("td",{parentName:"tr",align:null},"boolean"),(0,a.yg)("td",{parentName:"tr",align:null},"\u2713"),(0,a.yg)("td",{parentName:"tr",align:null},"Whether or not this asset should be displayed as a search filter"),(0,a.yg)("td",{parentName:"tr",align:null},"Searchable")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"showInAssetSummary"),(0,a.yg)("td",{parentName:"tr",align:null},"boolean"),(0,a.yg)("td",{parentName:"tr",align:null},"\u2713"),(0,a.yg)("td",{parentName:"tr",align:null},"Whether or not this asset should be displayed in the asset sidebar"),(0,a.yg)("td",{parentName:"tr",align:null},"Searchable")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"hideInAssetSummaryWhenEmpty"),(0,a.yg)("td",{parentName:"tr",align:null},"boolean"),(0,a.yg)("td",{parentName:"tr",align:null},"\u2713"),(0,a.yg)("td",{parentName:"tr",align:null},"Whether or not this asset should be hidden in the asset sidebar (showInAssetSummary should be ena..."),(0,a.yg)("td",{parentName:"tr",align:null},"Searchable")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"showAsAssetBadge"),(0,a.yg)("td",{parentName:"tr",align:null},"boolean"),(0,a.yg)("td",{parentName:"tr",align:null},"\u2713"),(0,a.yg)("td",{parentName:"tr",align:null},"Whether or not this asset should be displayed as an asset badge on other asset's headers"),(0,a.yg)("td",{parentName:"tr",align:null},"Searchable")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"showInColumnsTable"),(0,a.yg)("td",{parentName:"tr",align:null},"boolean"),(0,a.yg)("td",{parentName:"tr",align:null},"\u2713"),(0,a.yg)("td",{parentName:"tr",align:null},"Whether or not this asset should be displayed as a column in the schema field table in a Dataset'..."),(0,a.yg)("td",{parentName:"tr",align:null},"Searchable")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"lastModified"),(0,a.yg)("td",{parentName:"tr",align:null},(0,a.yg)("a",{parentName:"td",href:"#auditstamp"},"AuditStamp")),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"Last Modified Audit stamp"),(0,a.yg)("td",{parentName:"tr",align:null},"Searchable"))))),(0,a.yg)(i.A,{value:"raw",label:"Raw Schema",mdxType:"TabItem"},(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-javascript"},'{\n "type": "record",\n "Aspect": {\n "name": "structuredPropertySettings"\n },\n "name": "StructuredPropertySettings",\n "namespace": "com.linkedin.structured",\n "fields": [\n {\n "Searchable": {\n "fieldType": "BOOLEAN"\n },\n "type": "boolean",\n "name": "isHidden",\n "default": false,\n "doc": "Whether or not this asset should be hidden in the main application"\n },\n {\n "Searchable": {\n "fieldType": "BOOLEAN"\n },\n "type": "boolean",\n "name": "showInSearchFilters",\n "default": false,\n "doc": "Whether or not this asset should be displayed as a search filter"\n },\n {\n "Searchable": {\n "fieldType": "BOOLEAN"\n },\n "type": "boolean",\n "name": "showInAssetSummary",\n "default": false,\n "doc": "Whether or not this asset should be displayed in the asset sidebar"\n },\n {\n "Searchable": {\n "fieldType": "BOOLEAN"\n },\n "type": "boolean",\n "name": "hideInAssetSummaryWhenEmpty",\n "default": false,\n "doc": "Whether or not this asset should be hidden in the asset sidebar (showInAssetSummary should be enabled)\\nwhen its value is empty"\n },\n {\n "Searchable": {\n "fieldType": "BOOLEAN"\n },\n "type": "boolean",\n "name": "showAsAssetBadge",\n "default": false,\n "doc": "Whether or not this asset should be displayed as an asset badge on other\\nasset\'s headers"\n },\n {\n "Searchable": {\n "fieldType": "BOOLEAN"\n },\n "type": "boolean",\n "name": "showInColumnsTable",\n "default": false,\n "doc": "Whether or not this asset should be displayed as a column in the schema field table\\nin a Dataset\'s \\"Columns\\" tab."\n },\n {\n "Searchable": {\n "/time": {\n "fieldName": "lastModifiedSettings",\n "fieldType": "DATETIME"\n }\n },\n "type": [\n "null",\n {\n "type": "record",\n "name": "AuditStamp",\n "namespace": "com.linkedin.common",\n "fields": [\n {\n "type": "long",\n "name": "time",\n "doc": "When did the resource/association/sub-resource move into the specific lifecycle stage represented by this AuditEvent."\n },\n {\n "java": {\n "class": "com.linkedin.common.urn.Urn"\n },\n "type": "string",\n "name": "actor",\n "doc": "The entity (e.g. a member URN) which will be credited for moving the resource/association/sub-resource into the specific lifecycle stage. It is also the one used to authorize the change."\n },\n {\n "java": {\n "class": "com.linkedin.common.urn.Urn"\n },\n "type": [\n "null",\n "string"\n ],\n "name": "impersonator",\n "default": null,\n "doc": "The entity (e.g. a service URN) which performs the change on behalf of the Actor and must be authorized to act as the Actor."\n },\n {\n "type": [\n "null",\n "string"\n ],\n "name": "message",\n "default": null,\n "doc": "Additional context around how DataHub was informed of the particular change. For example: was the change created by an automated process, or manually."\n }\n ],\n "doc": "Data captured on a resource/association/sub-resource level giving insight into when that resource/association/sub-resource moved into a particular lifecycle stage, and who acted to move it into that specific lifecycle stage."\n }\n ],\n "name": "lastModified",\n "default": null,\n "doc": "Last Modified Audit stamp"\n }\n ],\n "doc": "Settings specific to a structured property entity"\n}\n')))),(0,a.yg)("h4",{id:"institutionalmemory"},"institutionalMemory"),(0,a.yg)("p",null,"Institutional memory of an entity. This is a way to link to relevant documentation and provide description of the documentation. Institutional or tribal knowledge is very important for users to leverage the entity."),(0,a.yg)(r.A,{mdxType:"Tabs"},(0,a.yg)(i.A,{value:"fields",label:"Fields",default:!0,mdxType:"TabItem"},(0,a.yg)("table",null,(0,a.yg)("thead",{parentName:"table"},(0,a.yg)("tr",{parentName:"thead"},(0,a.yg)("th",{parentName:"tr",align:null},"Field"),(0,a.yg)("th",{parentName:"tr",align:null},"Type"),(0,a.yg)("th",{parentName:"tr",align:null},"Required"),(0,a.yg)("th",{parentName:"tr",align:null},"Description"),(0,a.yg)("th",{parentName:"tr",align:null},"Annotations"))),(0,a.yg)("tbody",{parentName:"table"},(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"elements"),(0,a.yg)("td",{parentName:"tr",align:null},"InstitutionalMemoryMetadata[]"),(0,a.yg)("td",{parentName:"tr",align:null},"\u2713"),(0,a.yg)("td",{parentName:"tr",align:null},"List of records that represent institutional memory of an entity. Each record consists of a link,..."),(0,a.yg)("td",{parentName:"tr",align:null}))))),(0,a.yg)(i.A,{value:"raw",label:"Raw Schema",mdxType:"TabItem"},(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-javascript"},'{\n "type": "record",\n "Aspect": {\n "name": "institutionalMemory"\n },\n "name": "InstitutionalMemory",\n "namespace": "com.linkedin.common",\n "fields": [\n {\n "type": {\n "type": "array",\n "items": {\n "type": "record",\n "name": "InstitutionalMemoryMetadata",\n "namespace": "com.linkedin.common",\n "fields": [\n {\n "java": {\n "class": "com.linkedin.common.url.Url",\n "coercerClass": "com.linkedin.common.url.UrlCoercer"\n },\n "type": "string",\n "name": "url",\n "doc": "Link to an engineering design document or a wiki page."\n },\n {\n "type": "string",\n "name": "description",\n "doc": "Description of the link."\n },\n {\n "type": {\n "type": "record",\n "name": "AuditStamp",\n "namespace": "com.linkedin.common",\n "fields": [\n {\n "type": "long",\n "name": "time",\n "doc": "When did the resource/association/sub-resource move into the specific lifecycle stage represented by this AuditEvent."\n },\n {\n "java": {\n "class": "com.linkedin.common.urn.Urn"\n },\n "type": "string",\n "name": "actor",\n "doc": "The entity (e.g. a member URN) which will be credited for moving the resource/association/sub-resource into the specific lifecycle stage. It is also the one used to authorize the change."\n },\n {\n "java": {\n "class": "com.linkedin.common.urn.Urn"\n },\n "type": [\n "null",\n "string"\n ],\n "name": "impersonator",\n "default": null,\n "doc": "The entity (e.g. a service URN) which performs the change on behalf of the Actor and must be authorized to act as the Actor."\n },\n {\n "type": [\n "null",\n "string"\n ],\n "name": "message",\n "default": null,\n "doc": "Additional context around how DataHub was informed of the particular change. For example: was the change created by an automated process, or manually."\n }\n ],\n "doc": "Data captured on a resource/association/sub-resource level giving insight into when that resource/association/sub-resource moved into a particular lifecycle stage, and who acted to move it into that specific lifecycle stage."\n },\n "name": "createStamp",\n "doc": "Audit stamp associated with creation of this record"\n },\n {\n "type": [\n "null",\n "com.linkedin.common.AuditStamp"\n ],\n "name": "updateStamp",\n "default": null,\n "doc": "Audit stamp associated with updation of this record"\n },\n {\n "type": [\n "null",\n {\n "type": "record",\n "name": "InstitutionalMemoryMetadataSettings",\n "namespace": "com.linkedin.common",\n "fields": [\n {\n "type": "boolean",\n "name": "showInAssetPreview",\n "default": false,\n "doc": "Show record in asset preview like on entity header and search previews"\n }\n ],\n "doc": "Settings related to a record of InstitutionalMemoryMetadata"\n }\n ],\n "name": "settings",\n "default": null,\n "doc": "Settings for this record"\n }\n ],\n "doc": "Metadata corresponding to a record of institutional memory."\n }\n },\n "name": "elements",\n "doc": "List of records that represent institutional memory of an entity. Each record consists of a link, description, creator and timestamps associated with that record."\n }\n ],\n "doc": "Institutional memory of an entity. This is a way to link to relevant documentation and provide description of the documentation. Institutional or tribal knowledge is very important for users to leverage the entity."\n}\n')))),(0,a.yg)("h4",{id:"status"},"status"),(0,a.yg)("p",null,"The lifecycle status metadata of an entity, e.g. dataset, metric, feature, etc.\nThis aspect is used to represent soft deletes conventionally."),(0,a.yg)(r.A,{mdxType:"Tabs"},(0,a.yg)(i.A,{value:"fields",label:"Fields",default:!0,mdxType:"TabItem"},(0,a.yg)("table",null,(0,a.yg)("thead",{parentName:"table"},(0,a.yg)("tr",{parentName:"thead"},(0,a.yg)("th",{parentName:"tr",align:null},"Field"),(0,a.yg)("th",{parentName:"tr",align:null},"Type"),(0,a.yg)("th",{parentName:"tr",align:null},"Required"),(0,a.yg)("th",{parentName:"tr",align:null},"Description"),(0,a.yg)("th",{parentName:"tr",align:null},"Annotations"))),(0,a.yg)("tbody",{parentName:"table"},(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"removed"),(0,a.yg)("td",{parentName:"tr",align:null},"boolean"),(0,a.yg)("td",{parentName:"tr",align:null},"\u2713"),(0,a.yg)("td",{parentName:"tr",align:null},"Whether the entity has been removed (soft-deleted)."),(0,a.yg)("td",{parentName:"tr",align:null},"Searchable"))))),(0,a.yg)(i.A,{value:"raw",label:"Raw Schema",mdxType:"TabItem"},(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-javascript"},'{\n "type": "record",\n "Aspect": {\n "name": "status"\n },\n "name": "Status",\n "namespace": "com.linkedin.common",\n "fields": [\n {\n "Searchable": {\n "fieldType": "BOOLEAN"\n },\n "type": "boolean",\n "name": "removed",\n "default": false,\n "doc": "Whether the entity has been removed (soft-deleted)."\n }\n ],\n "doc": "The lifecycle status metadata of an entity, e.g. dataset, metric, feature, etc.\\nThis aspect is used to represent soft deletes conventionally."\n}\n')))),(0,a.yg)("h3",{id:"common-types"},"Common Types"),(0,a.yg)("p",null,"These types are used across multiple aspects in this entity."),(0,a.yg)("h4",{id:"auditstamp"},"AuditStamp"),(0,a.yg)("p",null,"Data captured on a resource/association/sub-resource level giving insight into when that resource/association/sub-resource moved into a particular lifecycle stage, and who acted to move it into that specific lifecycle stage."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Fields:")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"time")," (long): When did the resource/association/sub-resource move into the specific lifecyc..."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"actor")," (string): The entity (e.g. a member URN) which will be credited for moving the resource..."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"impersonator")," (string?): The entity (e.g. a service URN) which performs the change on behalf of the Ac..."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"message")," (string?): Additional context around how DataHub was informed of the particular change. ...")),(0,a.yg)("h3",{id:"relationships"},"Relationships"),(0,a.yg)("h4",{id:"outgoing"},"Outgoing"),(0,a.yg)("p",null,"These are the relationships stored in this entity's aspects"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},"StructuredPropertyOf"),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"EntityType via ",(0,a.yg)("inlineCode",{parentName:"li"},"propertyDefinition.entityTypes"))))),(0,a.yg)("h4",{id:"incoming"},"Incoming"),(0,a.yg)("p",null,"These are the relationships stored in other entity's aspects"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},"RelatedAsset"),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"Document via ",(0,a.yg)("inlineCode",{parentName:"li"},"documentInfo.relatedAssets.asset"))))),(0,a.yg)("h3",{id:"global-metadata-model"},(0,a.yg)("a",{parentName:"h3",href:"https://github.com/datahub-project/static-assets/raw/main/imgs/datahub-metadata-model.png"},"Global Metadata Model")),(0,a.yg)("p",null,(0,a.yg)("img",{parentName:"p",src:"https://github.com/datahub-project/static-assets/raw/main/imgs/datahub-metadata-model.png",alt:"Global Graph"})))}h.isMDXComponent=!0}}]); |