Query Entity Relationships in Knowledge Graph
User Intent
Operation
Prerequisites
Complete Code Example (TypeScript)
import { Graphlit } from 'graphlit-client';
import { ObservableTypes, EntityState } from 'graphlit-client/dist/generated/graphql-types';
const graphlit = new Graphlit();
console.log('=== Querying Entity Relationships ===\n');
// Example 1: Find all people at Graphlit
console.log('Example 1: Person → Organization\n');
// First, find the Graphlit organization entity
const graphlitOrg = await graphlit.queryObservables({
search: "Graphlit",
filter: {
types: [ObservableTypes.Organization],
states: [EntityState.Enabled]
}
});
if (graphlitOrg.observables.results.length > 0) {
const orgId = graphlitOrg.observables.results[0].observable.id;
console.log(`Found organization: ${graphlitOrg.observables.results[0].observable.name}\n`);
// Find all content mentioning Graphlit
const graphlitContent = await graphlit.queryContents({
observations: [{
type: ObservableTypes.Organization,
observable: { id: orgId }
}]
});
// Extract all people mentioned in that content
const peopleAtGraphlit = new Map<string, { id: string; name: string }>();
graphlitContent.contents.results.forEach(content => {
content.observations
?.filter(obs => obs.type === ObservableTypes.Person)
.forEach(obs => {
peopleAtGraphlit.set(obs.observable.id, {
id: obs.observable.id,
name: obs.observable.name
});
});
});
console.log(`People at Graphlit: ${peopleAtGraphlit.size}`);
Array.from(peopleAtGraphlit.values()).slice(0, 5).forEach(person => {
console.log(` - ${person.name}`);
});
if (peopleAtGraphlit.size > 5) {
console.log(` ... and ${peopleAtGraphlit.size - 5} more`);
}
}
console.log('\n---\n');
// Example 2: Find all events at a location
console.log('Example 2: Event → Place\n');
// Find a place entity
const seattle = await graphlit.queryObservables({
search: "Seattle",
filter: {
types: [ObservableTypes.Place],
states: [EntityState.Enabled]
}
});
if (seattle.observables.results.length > 0) {
const placeId = seattle.observables.results[0].observable.id;
console.log(`Found place: ${seattle.observables.results[0].observable.name}\n`);
// Find content mentioning both events and this place
const contentWithPlace = await graphlit.queryContents({
observations: [{
type: ObservableTypes.Place,
observable: { id: placeId }
}]
});
// Extract events from that content
const eventsAtPlace = new Set<string>();
contentWithPlace.contents.results.forEach(content => {
content.observations
?.filter(obs => obs.type === ObservableTypes.Event)
.forEach(obs => {
eventsAtPlace.add(obs.observable.name);
});
});
console.log(`Events in Seattle: ${eventsAtPlace.size}`);
Array.from(eventsAtPlace).slice(0, 5).forEach(event => {
console.log(` - ${event}`);
});
}
console.log('\n---\n');
// Example 3: Find products by organization
console.log('Example 3: Product → Organization\n');
// Find Microsoft
const microsoft = await graphlit.queryObservables({
search: "Microsoft",
filter: {
types: [ObservableTypes.Organization],
states: [EntityState.Enabled]
}
});
if (microsoft.observables.results.length > 0) {
const msftId = microsoft.observables.results[0].observable.id;
console.log(`Found organization: ${microsoft.observables.results[0].observable.name}\n`);
// Find content mentioning Microsoft
const msftContent = await graphlit.queryContents({
observations: [{
type: ObservableTypes.Organization,
observable: { id: msftId }
}]
});
// Extract products
const msftProducts = new Map<string, number>();
msftContent.contents.results.forEach(content => {
content.observations
?.filter(obs => obs.type === ObservableTypes.Product)
.forEach(obs => {
msftProducts.set(
obs.observable.name,
(msftProducts.get(obs.observable.name) || 0) + 1
);
});
});
console.log(`Products by Microsoft: ${msftProducts.size}`);
Array.from(msftProducts.entries())
.sort((a, b) => b[1] - a[1])
.slice(0, 5)
.forEach(([product, count]) => {
console.log(` - ${product} (mentioned ${count} times)`);
});
}
console.log('\n---\n');
// Example 4: Multi-hop relationship (Person → Organization → Event)
console.log('Example 4: Multi-hop Relationship (Person → Org → Event)\n');
// Find a person
const person = await graphlit.queryObservables({
search: "Kirk Marple",
filter: {
types: [ObservableTypes.Person],
states: [EntityState.Enabled]
}
});
if (person.observables.results.length > 0) {
const personId = person.observables.results[0].observable.id;
console.log(`Person: ${person.observables.results[0].observable.name}\n`);
// Step 1: Find organizations this person is associated with
const personContent = await graphlit.queryContents({
observations: [{
type: ObservableTypes.Person,
observable: { id: personId }
}]
});
const relatedOrgs = new Set<string>();
personContent.contents.results.forEach(content => {
content.observations
?.filter(obs => obs.type === ObservableTypes.Organization)
.forEach(obs => {
relatedOrgs.add(obs.observable.id);
});
});
console.log(`Associated organizations: ${relatedOrgs.size}`);
// Step 2: For each organization, find events
const allEvents = new Set<string>();
for (const orgId of Array.from(relatedOrgs).slice(0, 3)) { // Limit for demo
const orgEvents = await graphlit.queryContents({
observations: [{
type: ObservableTypes.Organization,
observable: { id: orgId }
}]
});
orgEvents.contents.results.forEach(content => {
content.observations
?.filter(obs => obs.type === ObservableTypes.Event)
.forEach(obs => {
allEvents.add(obs.observable.name);
});
});
}
console.log(`Events related to person's organizations: ${allEvents.size}`);
Array.from(allEvents).slice(0, 5).forEach(event => {
console.log(` - ${event}`);
});
}
console.log('\n✓ Relationship queries complete!');Step-by-Step Explanation
Step 1: Understanding Relationship Types
Step 2: Query Pattern 1 - Find Related Entities
Step 3: Query Pattern 2 - Co-Occurrence Filtering
Step 4: Query Pattern 3 - Multi-Hop Relationships
Step 5: Relationship Strength (Frequency)
Configuration Options
Filtering by Content Type
Time-Based Relationship Queries
Confidence-Based Filtering
Variations
Variation 1: Build Network Graph
Variation 2: Relationship Timeline
Variation 3: Entity Influence Score
Variation 4: Relationship Path Finding
Variation 5: Relationship Export for Analysis
Common Issues & Solutions
Issue: Too Many API Calls for Large Graphs
Issue: No Relationships Found
Issue: Duplicate Relationships
Issue: Slow Multi-Hop Queries
Developer Hints
Relationship Query Performance
Relationship Types by Content
Co-Occurrence Reliability
Graph Traversal Strategies
Last updated