ArcGIS Pro 3.4 API Reference Guide
ArcGIS.Core.Data.Knowledge Namespace / KnowledgeGraphNamedObjectType Class / GetShapeDefinition Method
Example Version

GetShapeDefinition Method
Gets the ArcGIS.Core.Geometry.GeometryType and ArcGIS.Core.Geometry.SpatialReference for the shape column of the named object type. This method must be called on the MCT. Use QueuedTask.Run.
Syntax

Return Value

The ArcGIS.Core.Geometry.GeometryType for the named object type.
Exceptions
ExceptionDescription
This method or property must be called within the lambda passed to QueuedTask.Run.
Remarks
The spatial reference of a shape column in a named object type will always match the spatial reference of the knowledge graph, see KnowledgeGraph.GetSpatialReference.
If the named object type is not spatial (i.e. GetIsSpatial return false), then the geometry type will be ArcGIS.Core.Geometry.GeometryType.Unknown and the spatial reference will be null.
Example
Modify Entity and Relationship Type Schemas with SchemaBuilder
await QueuedTask.Run(() =>
{
  using (var kg = GetKnowledgeGraph())
  {
    if (kg == null)
      return;

    var entity_name = "PhoneCall";
    var relate_name = "WhoCalledWho";

    var kvp_entity = kg.GetDataModel().GetEntityTypes()
         .First(r => r.Key == entity_name);
    var kvp_relate = kg.GetDataModel().GetRelationshipTypes()
                   .First(r => r.Key == relate_name);

    //Let's delete one field and add a new one from each
    //A field gets deleted implicitly if it is not included in the list of
    //fields - or "properties" in this case....so we will remove the last
    //property from the list
    var entity_props = kvp_entity.Value.GetProperties().Reverse().Skip(1).Reverse();
    var prop_descs = new List<KnowledgeGraphPropertyDescription>();

    foreach (var prop in entity_props)
    {
      if (prop.FieldType == FieldType.Geometry)
      {
        continue;//skip shape
      }
      var prop_desc = new KnowledgeGraphPropertyDescription(prop);
      prop_descs.Add(prop_desc);
    }
    //deal with shape - we need to keep it
    //SchemaBuilder deletes any field not included in the "modify" list
    ShapeDescription shape_desc = null;
    if (kvp_entity.Value.GetIsSpatial())
    {
      var geom_def = kvp_entity.Value.GetShapeDefinition();
      var shape_name = kvp_entity.Value.GetShapeField();
      shape_desc = new ShapeDescription(
        shape_name, geom_def.geometryType, geom_def.sr);
    }
    //add the new entity property
    prop_descs.Add(
      KnowledgeGraphPropertyDescription.CreateStringProperty("foo", 10));
    //make a description for the entity type - ok if shape_desc is null
    var entityDesc = new KnowledgeGraphEntityTypeDescription(
      entity_name, prop_descs, shape_desc);

    //Add the entity type description to the schema builder using 'Modify'
    SchemaBuilder sb = new(kg);
    sb.Modify(entityDesc);

    //Repeat for the relationship - assuming we have at least one custom attribute field
    //that can be deleted on our relationship schema...
    var rel_props = kvp_relate.Value.GetProperties().Reverse().Skip(1).Reverse();
    var rel_prop_descs = new List<KnowledgeGraphPropertyDescription>();

    foreach (var prop in rel_props)
    {
      if (prop.FieldType == FieldType.Geometry)
      {
        continue;//skip shape
      }
      var prop_desc = new KnowledgeGraphPropertyDescription(prop);
      rel_prop_descs.Add(prop_desc);
    }
    //deal with shape - we need to keep it
    //SchemaBuilder deletes any field not included in the "modify" list
    ShapeDescription shape_desc_rel = null;
    if (kvp_relate.Value.GetIsSpatial())
    {
      var geom_def = kvp_relate.Value.GetShapeDefinition();
      var shape_name = kvp_relate.Value.GetShapeField();
      shape_desc_rel = new ShapeDescription(
        shape_name, geom_def.geometryType, geom_def.sr);
    }
    //add a new relationship property
    rel_prop_descs.Add(
      KnowledgeGraphPropertyDescription.CreateStringProperty("bar", 10));
    //make a description for the relationship type - ok if shape_desc is null
    var relDesc = new KnowledgeGraphRelationshipTypeDescription(
      relate_name, rel_prop_descs, shape_desc_rel);

    //Add the relationship type description to the schema builder using 'Modify'
    sb.Modify(relDesc);

    //Run the schema builder
    try
    {
      //Use the KnowledgeGraph extension method 'ApplySchemaEdits(...)'
      //to refresh the Pro UI
      if (!kg.ApplySchemaEdits(sb))
      {
        var err_msg = string.Join(",", sb.ErrorMessages.ToArray());
        System.Diagnostics.Debug.WriteLine($"Entity/Relate Modify error: {err_msg}");
      }
    }
    catch (Exception ex)
    {
      System.Diagnostics.Debug.WriteLine(ex.ToString());
    }
  }
});
Requirements

Target Platforms: Windows 11, Windows 10

ArcGIS Pro version: 3.4 or higher.
See Also