ArcGIS Pro 3.6 API Reference Guide
ArcGIS.Core.CIM Namespace / CIMKnowledgeGraphSubGraph Class / RelationshipFilters Property
Example

In This Topic
    RelationshipFilters Property
    In This Topic
    Gets or sets the relationship filters of the subgraph. The relationships of the subgraph are the relationships included by "include" filters (or all relationships if there is no "include" filter), except relationships excluded by "exclude" filters and relationships involving at least one entity that is not in the subgraph.
    Syntax
    public CIMKnowledgeGraphNamedTypeFilter[] RelationshipFilters {get; set;}
    Public Property RelationshipFilters As CIMKnowledgeGraphNamedTypeFilter()
    Example
    Configure Centrality Relationship SubGraph Filters
          //using ArcGIS.Core.Data.Knowledge.Extensions;
    
          await QueuedTask.Run(() =>
    {
    
              //Assume Relationship NamedTypes "R1","R2",and "R3"
              //
              //We can use either of a CIMKnowledgeGraphNamedTypeFilterByInstances
              //or CIMKnowledgeGraphNamedTypeFilterByType to filter instances for
              //_including_ in or _excluding_ from entities and relates wrt the subgraph.
              //
              //Use CIMKnowledgeGraphNamedTypeFilterByInstances to filter by instance id
              //Use CIMKnowledgeGraphNamedTypeFilterByType to filter by type name and with
              //an optional property filter predicate to filter by property value(s)
    
              //Example 1.
              //Include all relates (and entities) from the kg in the subgraph
              //Leave kg_subgraph.RelationshipFilters null
              //(kg_subgraph.EntityFilters is also null)
    
              //The collection of Entity and Relate filters are both empty
      //Everything is included
              var kg_subgraph = new CIMKnowledgeGraphSubGraph();
              //note - relates can only be included if their corresponding entity end points
              //are also included in the subgraph.
    
              //Example 2
              //Include a set of Relates from R1 (all of R2, R3 will be implicitly excluded)
              var kg_filter_r2 = new CIMKnowledgeGraphNamedTypeFilterByInstances()
      {
                  FilterType = KGFilterType.Include,
                  NamedType = "R1",
                  InstancesIDs = list_of_ids.ToArray() //list_of_ids contains desired uids for "R1"
                                                                                           //note: -if list_of_ids is empty then -no-
                                                                                           //instances of R1 will be included.
              };
    
      //var kg_subgraph = ...
      var relate_filters2 = new List<CIMKnowledgeGraphNamedTypeFilter>();
      relate_filters2.Add(kg_filter_r2);
    
      //note: All entities are included as no EntityFilters are specified
      //var kg_subgraph = ...
      kg_subgraph.RelationshipFilters = relate_filters2.ToArray();
    
      //Example 3
      //Exclude a set of Relates from R1 (all of R2, R3 will be implicitly included)
      var kg_filter_r3 = new CIMKnowledgeGraphNamedTypeFilterByInstances()
      {
                  FilterType = KGFilterType.Exclude,
                  NamedType = "R1",
                  InstancesIDs = list_of_ids.ToArray() //list_of_ids contains desired uids for "R1"
                                                                                           //note: -if list_of_ids is empty then -no-
                                                                                           //instances of R1 will be excluded.
              };
    
      var relate_filters3 = new List<CIMKnowledgeGraphNamedTypeFilter>();
      relate_filters3.Add(kg_filter_r3);
      //note: All entities are included as no EntityFilters are specified
      //var kg_subgraph = ...
      kg_subgraph.RelationshipFilters = relate_filters3.ToArray();
    
      //Example 4
      //Include all Relates from R1 via named type (all of R2, R3
      //will be implicitly excluded)
      var kg_filter_r4 = new CIMKnowledgeGraphNamedTypeFilterByType()
      {
                  FilterType = KGFilterType.Include,
                  NamedType = "R1",//all of R1 will be included
                                                   //predicate is empty
              };
    
      var relate_filters4 = new List<CIMKnowledgeGraphNamedTypeFilter>();
      relate_filters4.Add(kg_filter_r4);
    
      //note: All entities are included as no EntityFilters are specified
      //var kg_subgraph = ...
      kg_subgraph.RelationshipFilters = relate_filters4.ToArray();
    
      //Example 5
      //Exclude all Relates from R1 via named type (all of R2, R3
      //will be implicitly included)
    
      var kg_filter_r5 = new CIMKnowledgeGraphNamedTypeFilterByType()
      {
                  FilterType = KGFilterType.Exclude,
                  NamedType = "R1" //all of R1 will be excluded
      };
    
      var relate_filters5 = new List<CIMKnowledgeGraphNamedTypeFilter>();
      relate_filters5.Add(kg_filter_r5);
    
      //note: All entities are included as no EntityFilters are specified
      //var kg_subgraph = ...
      kg_subgraph.RelationshipFilters = relate_filters5.ToArray();
    
      //Example 6
      //Include all relates from R2 and
      //a subset from R3 (R1 is implicitly excluded)
      var kg_filter_r6_r2 = new CIMKnowledgeGraphNamedTypeFilterByType();
      kg_filter_r6_r2.NamedType = "R2"; //Include is default, predicate is empty
    
              //TODO... populate list with uids from "R3"...
              var kg_filter_r6_r3 = new CIMKnowledgeGraphNamedTypeFilterByInstances();
              kg_filter_r6_r3.NamedType = "R3"; //Include is default
              kg_filter_r6_r3.InstancesIDs = list_of_ids.ToArray();
    
      var relate_filters6 = new List<CIMKnowledgeGraphNamedTypeFilter>();
      relate_filters6.Add(kg_filter_r6_r2);//order doesn't matter
      relate_filters6.Add(kg_filter_r6_r3);
    
              //note: All entities are included as no EntityFilters are specified
              //var kg_subgraph = ...
              kg_subgraph.RelationshipFilters = relate_filters6.ToArray();
    
      //Example 7
      //Exclude all relates from R2 and
      //a subset from R3 (R1 is implicitly included)
      var kg_filter_r7_r2 = new CIMKnowledgeGraphNamedTypeFilterByType();
      kg_filter_r7_r2.NamedType = "R2";
      kg_filter_r7_r2.FilterType = KGFilterType.Exclude;
    
              //TODO... populate list with uids from "R3"...
              var kg_filter_r7_r3 = new CIMKnowledgeGraphNamedTypeFilterByInstances();
              kg_filter_r7_r3.NamedType = "R3";
              kg_filter_r7_r3.FilterType = KGFilterType.Exclude;
              kg_filter_r7_r3.InstancesIDs = list_of_ids.ToArray();
    
      var relate_filters7 = new List<CIMKnowledgeGraphNamedTypeFilter>();
      relate_filters7.Add(kg_filter_r7_r2);//order doesn't matter
      relate_filters7.Add(kg_filter_r7_r3);
    
      //note: All entities are included as no EntityFilters are specified
      //var kg_subgraph = ...
      kg_subgraph.RelationshipFilters = relate_filters6.ToArray();
    
              //Example 8
              //Include a subset of Relates from R1 using a property
              //filter predicate (all of R2, R3 will be implicitly excluded)
    
              //we -must- use a predicate prefix in our expression
              //select instances of R1 w/Distance = 2000
              var expr8 = $"r1.Distance = 2000";//prefix can be anything - foo, bar, fred, etc.
    
              var kg_filter_r8 = new CIMKnowledgeGraphNamedTypeFilterByType()
      {
        NamedType = "R1", //Include is default
                  PropertyFilterPredicate = expr8
      };
    
      var relate_filters8 = new List<CIMKnowledgeGraphNamedTypeFilter>();
      relate_filters8.Add(kg_filter_r8);
    
              //note: All entities are included as no EntityFilters are specified
              //var kg_subgraph = ...
              kg_subgraph.RelationshipFilters = relate_filters8.ToArray();
    
              //Example 9
              //Exclude a subset of Relates from R1 using a property
              //filter predicate (all of R2, R3 will be implicitly included)
    
              //we -must- use a predicate prefix in our expression
              //select instances of R1 w/ Distance <> 2000
              var expr9 = $"r1.Distance <> 2000";//prefix can be anything - foo, bar, fred, etc.
    
              var kg_filter_r9 = new CIMKnowledgeGraphNamedTypeFilterByType()
      {
                  FilterType = KGFilterType.Exclude,
                  NamedType = "R1",
                  PropertyFilterPredicate = expr9 //exclude ids w/ Distance <> 2000
              };
    
      var relate_filters9 = new List<CIMKnowledgeGraphNamedTypeFilter>();
      relate_filters9.Add(kg_filter_r9);
    
              //Note: All entities are included as no EntityFilters are specified
              //var kg_subgraph = ...
              kg_subgraph.RelationshipFilters = relate_filters9.ToArray();
          });
    Combine Centrality Entity and Relationship SubGraph Filters
          //using ArcGIS.Core.Data.Knowledge.Extensions;
    
          await QueuedTask.Run(() =>
    {
      //Assume Entity NamedTypes "A","B","C", and "D"
      //Assume Relationship NamedTypes "R1","R2",and "R3"
    
      //Example 1
      //Include all Entities from A and B
      //Include all Relates from R1 and R2
      //(all of C, D, and R3 will be implicitly excluded)
      var kg_filter1_a = new CIMKnowledgeGraphNamedTypeFilterByType()
      {
        FilterType = KGFilterType.Include,//default
                  NamedType = "A"
      };
      var kg_filter1_b = new CIMKnowledgeGraphNamedTypeFilterByType()
      {
                  FilterType = KGFilterType.Include,//default
                  NamedType = "B"
      };
      var kg_filter1_r1 = new CIMKnowledgeGraphNamedTypeFilterByType()
      {
                  FilterType = KGFilterType.Include,//default
                  NamedType = "R1"
      };
      var kg_filter1_r2 = new CIMKnowledgeGraphNamedTypeFilterByType()
      {
                  FilterType = KGFilterType.Include,//default
                  NamedType = "R2"
      };
    
      var entity_filters1 = new List<CIMKnowledgeGraphNamedTypeFilter>();
      entity_filters1.Add(kg_filter1_a);
      entity_filters1.Add(kg_filter1_b);
    
      var relate_filters1 = new List<CIMKnowledgeGraphNamedTypeFilter>();
      relate_filters1.Add(kg_filter1_r1);
      relate_filters1.Add(kg_filter1_r2);
    
      //var kg_subgraph = ...
      kg_subgraph.EntityFilters = entity_filters1.ToArray();
      kg_subgraph.RelationshipFilters = relate_filters1.ToArray();
    
      //Example 2 - 
      //Include a subset of Entities from A using a predicate,
      //and all of B, C, D and all of R1 and R3 (but not R2)
    
      var prefix2 = "a";//prefix can be anything - foo, bar, fred, etc.
      var expr2 = $"{prefix2}.Material = 'Steel' AND " +
                      $"{prefix2}.Role = 'Tier1'";
    
      var kg_filter2_a = new CIMKnowledgeGraphNamedTypeFilterByType()
      {
        NamedType = "A", //Include is default
                  PropertyFilterPredicate = expr2
      };
      var kg_filter2_b = new CIMKnowledgeGraphNamedTypeFilterByType()
      {
        NamedType = "B" //Include is default
              };
      var kg_filter2_c = new CIMKnowledgeGraphNamedTypeFilterByType()
      {
        NamedType = "C" //Include is default
              };
      var kg_filter2_d = new CIMKnowledgeGraphNamedTypeFilterByType()
      {
        NamedType = "D" //Include is default
              };
    
      var kg_filter2_r1 = new CIMKnowledgeGraphNamedTypeFilterByType()
      {
        NamedType = "R1" //Include is default
              };
      var kg_filter2_r3 = new CIMKnowledgeGraphNamedTypeFilterByType()
      {
        NamedType = "R3" //Include is default
              };
    
      var entity_filters2 = new List<CIMKnowledgeGraphNamedTypeFilter>();
      entity_filters2.Add(kg_filter2_a);
      entity_filters2.Add(kg_filter2_b);
      entity_filters2.Add(kg_filter2_c);
      entity_filters2.Add(kg_filter2_d);
    
      var relate_filters2 = new List<CIMKnowledgeGraphNamedTypeFilter>();
      relate_filters2.Add(kg_filter2_r1);
      relate_filters2.Add(kg_filter2_r3);
    
      //var kg_subgraph = ...
      kg_subgraph.EntityFilters = entity_filters2.ToArray();
      kg_subgraph.RelationshipFilters = relate_filters2.ToArray();
    
      //Example 3
      //Exclude all entities from B and C and
      //a subset from D (A is implicitly included)
      //
      //Include all relates from R2 and
      //a subset from R3 (R1 is implicitly excluded)
    
      var kg_filter3_b = new CIMKnowledgeGraphNamedTypeFilterByType();
      var kg_filter3_c = new CIMKnowledgeGraphNamedTypeFilterByType();
      
      kg_filter3_b.NamedType = "B";
              kg_filter3_c.NamedType = "C";
      kg_filter3_b.FilterType = KGFilterType.Exclude;
              kg_filter3_c.FilterType = KGFilterType.Exclude;
    
              //TODO... populate list with uids from "D"...
              var kg_filter3_d = new CIMKnowledgeGraphNamedTypeFilterByInstances();
              kg_filter3_d.NamedType = "D";
              kg_filter3_d.FilterType = KGFilterType.Exclude;
              kg_filter3_d.InstancesIDs = list_of_ids.ToArray();
    
      var kg_filter3_r2 = new CIMKnowledgeGraphNamedTypeFilterByType();
      kg_filter3_r2.NamedType = "R2";//Include is default
    
              //TODO... populate list with uids from "R3"...
              var kg_filter3_r3 = new CIMKnowledgeGraphNamedTypeFilterByInstances();
              kg_filter3_r3.NamedType = "R3";//Include is default
              kg_filter3_r3.InstancesIDs = list_of_ids2.ToArray();
    
      var entity_filters3 = new List<CIMKnowledgeGraphNamedTypeFilter>();
      entity_filters3.Add(kg_filter3_b);//order doesn't matter
      entity_filters3.Add(kg_filter3_c);
      entity_filters3.Add(kg_filter3_d);
    
      var relate_filters3 = new List<CIMKnowledgeGraphNamedTypeFilter>();
      relate_filters3.Add(kg_filter3_r2);//order doesn't matter
      relate_filters3.Add(kg_filter3_r3);
    
      //var kg_subgraph = ...
      kg_subgraph.EntityFilters = entity_filters3.ToArray();
      kg_subgraph.RelationshipFilters = relate_filters3.ToArray();
    
    });
    Requirements

    Target Platforms: Windows 11, Windows 10

    ArcGIS Pro version: 3.6 or higher.
    See Also