Files
2026-08-11 10:40:10 +01:00

170 lines
6.6 KiB
Go

package domain
import "time"
// EntityType classifies an extracted subject.
type EntityType string
const (
EntityPerson EntityType = "person"
EntityOrganisation EntityType = "organisation"
EntityLocation EntityType = "location"
EntityProduct EntityType = "product"
EntityEvent EntityType = "event"
EntityDate EntityType = "date"
EntitySubject EntityType = "subject"
EntityConcept EntityType = "concept"
)
// ValidEntityTypes is the closed set of accepted entity types.
var ValidEntityTypes = []EntityType{
EntityPerson, EntityOrganisation, EntityLocation, EntityProduct,
EntityEvent, EntityDate, EntitySubject, EntityConcept,
}
// Valid reports whether t is a recognised entity type.
func (t EntityType) Valid() bool {
for _, v := range ValidEntityTypes {
if v == t {
return true
}
}
return false
}
// ExtractionMethod records how a derived record was produced.
type ExtractionMethod string
const (
MethodDeterministic ExtractionMethod = "deterministic"
MethodModel ExtractionMethod = "model"
MethodUser ExtractionMethod = "user"
)
// SourceRef points at the exact place a derived record came from.
// A claim or entity must never lose this link back to original text.
type SourceRef struct {
ItemID string `bson:"item_id" json:"item_id"`
ChunkID string `bson:"chunk_id,omitempty" json:"chunk_id,omitempty"`
// Start and End are byte offsets into the item's extracted text.
Start int `bson:"start" json:"start"`
End int `bson:"end" json:"end"`
// Quote is the verbatim text at those offsets.
Quote string `bson:"quote,omitempty" json:"quote,omitempty"`
Page int `bson:"page,omitempty" json:"page,omitempty"`
}
// Entity is an identifiable subject extracted from source material.
//
// Entities are keyed on (workspace, type, normalised name). Two entities whose
// names merely look alike are never merged automatically; a candidate alias is
// proposed instead and awaits confirmation.
type Entity struct {
ID string `bson:"_id" json:"id"`
WorkspaceID string `bson:"workspace_id" json:"workspace_id"`
CanonicalName string `bson:"canonical_name" json:"canonical_name"`
NormalisedKey string `bson:"normalised_key" json:"normalised_key"`
Type EntityType `bson:"type" json:"type"`
Aliases []string `bson:"aliases,omitempty" json:"aliases,omitempty"`
SourceRefs []SourceRef `bson:"source_refs,omitempty" json:"source_refs,omitempty"`
ItemIDs []string `bson:"item_ids" json:"item_ids"`
Method ExtractionMethod `bson:"method" json:"method"`
// EvidenceScore reflects how well-attested the entity is (mention count,
// extraction agreement). It is not a probability.
EvidenceScore float64 `bson:"evidence_score" json:"evidence_score"`
Mentions int `bson:"mentions" json:"mentions"`
ModelVersion string `bson:"model_version,omitempty" json:"model_version,omitempty"`
CreatedAt time.Time `bson:"created_at" json:"created_at"`
UpdatedAt time.Time `bson:"updated_at" json:"updated_at"`
Deleted bool `bson:"deleted" json:"deleted"`
}
// AliasStatus tracks whether a proposed alias link has been adjudicated.
type AliasStatus string
const (
AliasCandidate AliasStatus = "candidate"
AliasConfirmed AliasStatus = "confirmed"
AliasRejected AliasStatus = "rejected"
)
// EntityAlias is a proposed "these two names may be the same thing" link.
// It exists precisely so that name similarity does not silently merge entities.
type EntityAlias struct {
ID string `bson:"_id" json:"id"`
WorkspaceID string `bson:"workspace_id" json:"workspace_id"`
EntityID string `bson:"entity_id" json:"entity_id"`
Alias string `bson:"alias" json:"alias"`
Normalised string `bson:"normalised" json:"normalised"`
// CandidateEntityID is set when the alias points at another existing entity.
CandidateEntityID string `bson:"candidate_entity_id,omitempty" json:"candidate_entity_id,omitempty"`
Status AliasStatus `bson:"status" json:"status"`
Method ExtractionMethod `bson:"method" json:"method"`
Similarity float64 `bson:"similarity" json:"similarity"`
Reason string `bson:"reason,omitempty" json:"reason,omitempty"`
CreatedAt time.Time `bson:"created_at" json:"created_at"`
UpdatedAt time.Time `bson:"updated_at" json:"updated_at"`
}
// ClaimNature distinguishes how faithfully a claim reproduces its source.
type ClaimNature string
const (
ClaimQuoted ClaimNature = "quoted"
ClaimParaphrased ClaimNature = "paraphrased"
ClaimInferred ClaimNature = "inferred"
)
// Valid reports whether n is a recognised claim nature.
func (n ClaimNature) Valid() bool {
switch n {
case ClaimQuoted, ClaimParaphrased, ClaimInferred:
return true
}
return false
}
// Claim is a statement made by a source item. A claim is not a fact: it is a
// record that some source said something, and it always retains the exact text.
type Claim struct {
ID string `bson:"_id" json:"id"`
WorkspaceID string `bson:"workspace_id" json:"workspace_id"`
ItemID string `bson:"item_id" json:"item_id"`
ChunkID string `bson:"chunk_id,omitempty" json:"chunk_id,omitempty"`
// Statement is a short normalised rendering; SourceRef.Quote is the original.
Statement string `bson:"statement" json:"statement"`
SourceRef SourceRef `bson:"source_ref" json:"source_ref"`
// Attribution is who the source says is making the claim, where known.
Attribution string `bson:"attribution,omitempty" json:"attribution,omitempty"`
Nature ClaimNature `bson:"nature" json:"nature"`
// Subject and Predicate are coarse normalised keys used to find claims that
// talk about the same thing, which is how support/contradiction candidates
// are located without comparing every claim to every other claim.
Subject string `bson:"subject,omitempty" json:"subject,omitempty"`
Predicate string `bson:"predicate,omitempty" json:"predicate,omitempty"`
// Numbers and Dates hold normalised values mentioned in the claim, used to
// detect disagreement about the same quantity or date.
Numbers []float64 `bson:"numbers,omitempty" json:"numbers,omitempty"`
Dates []string `bson:"dates,omitempty" json:"dates,omitempty"`
// Polarity is +1 for affirmative, -1 for negated statements.
Polarity int `bson:"polarity" json:"polarity"`
Method ExtractionMethod `bson:"method" json:"method"`
ModelVersion string `bson:"model_version,omitempty" json:"model_version,omitempty"`
Confidence float64 `bson:"confidence" json:"confidence"`
DedupeKey string `bson:"dedupe_key" json:"-"`
CreatedAt time.Time `bson:"created_at" json:"created_at"`
Deleted bool `bson:"deleted" json:"deleted"`
}