Filter Content by Entities

User Intent

"How do I find all content mentioning a specific person or organization? Show me entity-based content filtering."

Operation

SDK Method: queryContents() with observations filter GraphQL Query: queryContents Use Case: Entity-driven content discovery

Prerequisites

  • Content with extracted entities

  • Knowledge of entity IDs or names

  • Understanding of Observable model


Complete Code Example (TypeScript)

import { Graphlit } from 'graphlit-client';
import { ObservableTypes, ContentTypes } from 'graphlit-client/dist/generated/graphql-types';

const graphlit = new Graphlit();

// Example 1: Find all content mentioning a person
async function findContentByPerson(personName: string) {
  // Step 1: Find the person entity
  const people = await graphlit.queryObservables({
    search: personName,
    filter: { types: [ObservableTypes.Person] }
  });
  
  if (people.observables.results.length === 0) {
    console.log(`No entity found for: ${personName}`);
    return;
  }
  
  const person = people.observables.results[0];
  console.log(`Found entity: ${person.observable.name} (${person.observable.id})\n`);
  
  // Step 2: Find all content mentioning this person
  const content = await graphlit.queryContents({
    filter: {
      observations: [{
        type: ObservableTypes.Person,
        observable: { id: person.observable.id }
      }]
    }
  });
  
  console.log(`Content mentioning ${person.observable.name}: ${content.contents.results.length}`);
  
  // Group by type
  const byType = new Map<string, number>();
  content.contents.results.forEach(item => {
    const type = item.type || 'UNKNOWN';
    byType.set(type, (byType.get(type) || 0) + 1);
  });
  
  console.log('\nBy content type:');
  byType.forEach((count, type) => {
    console.log(`  ${type}: ${count}`);
  });
  
  return content.contents.results;
}

// Example 2: Find content mentioning multiple entities (AND logic)
async function findContentWithMultipleEntities(
  personName: string,
  orgName: string
) {
  // Find entities
  const person = await graphlit.queryObservables({
    search: personName,
    filter: { types: [ObservableTypes.Person] }
  });
  
  const org = await graphlit.queryObservables({
    search: orgName,
    filter: { types: [ObservableTypes.Organization] }
  });
  
  if (person.observables.results.length === 0 || org.observables.results.length === 0) {
    console.log('One or both entities not found');
    return;
  }
  
  // Find content mentioning BOTH
  const content = await graphlit.queryContents({
    filter: {
      observations: [
        {
          type: ObservableTypes.Person,
          observable: { id: person.observables.results[0].observable.id }
        },
        {
          type: ObservableTypes.Organization,
          observable: { id: org.observables.results[0].observable.id }
        }
      ]
    }
  });
  
  console.log(`Content mentioning both ${personName} and ${orgName}: ${content.contents.results.length}`);
  
  return content.contents.results;
}

// Run examples
await findContentByPerson("Kirk Marple");
console.log('\n---\n');
await findContentWithMultipleEntities("Kirk Marple", "Graphlit");

Key Patterns

Pattern 1: Single Entity Filter

Find all content mentioning one entity:

const content = await graphlit.queryContents({
  filter: {
    observations: [{
      type: ObservableTypes.Person,
      observable: { id: entityId }
    }]
  }
});

Pattern 2: Multiple Entities (AND)

Content mentioning ALL specified entities:

const content = await graphlit.queryContents({
  filter: {
    observations: [
      { observable: { id: entityId1 } },
      { observable: { id: entityId2 } }
    ]
  }
});

Pattern 3: Entity Type Filter

All content with any entity of type:

const content = await graphlit.queryContents({
  filter: {
    observations: [{
      type: ObservableTypes.Organization
      // No specific observable ID = any organization
    }]
  }
});

Pattern 4: Combined Filters

Entity + content type + date:

const content = await graphlit.queryContents({
  filter: {
    types: [ContentTypes.Email],  // Only emails
    observations: [{
      type: ObservableTypes.Person,
      observable: { id: personId }
    }],
    creationDateRange: {
      from: '2024-01-01'
    }
  }
});

Use Cases

1. Entity Timeline: Track mentions over time 2. Cross-Source Discovery: Find entity across email, Slack, docs 3. Relationship Mapping: Content connecting two entities 4. Entity-Specific Search: Scope search to entity context 5. Content Audit: What references this person/org?


Developer Hints

  • Entity filters query graph database (slower than pure content queries)

  • Combine with content type filters for speed

  • Use entity search first to get IDs

  • Multiple entity filters = AND logic (all must match)

  • Great for focused discovery


Last updated

Was this helpful?