Current section

Files

Jump to
arcana lib arcana graph community.ex
Raw

lib/arcana/graph/community.ex

defmodule Arcana.Graph.Community do
@moduledoc """
Schema for knowledge graph communities.
Communities are clusters of related entities detected by the
Leiden algorithm. They enable global queries by providing
pre-generated summaries at different hierarchy levels.
"""
use Ecto.Schema
import Ecto.Changeset
alias Arcana.Collection
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "arcana_graph_communities" do
field(:level, :integer)
field(:description, :string)
field(:summary, :string)
field(:entity_ids, {:array, :binary_id}, default: [])
field(:dirty, :boolean, default: true)
field(:change_count, :integer, default: 0)
belongs_to(:collection, Collection)
timestamps()
end
@required_fields [:level]
@optional_fields [:description, :summary, :entity_ids, :dirty, :change_count, :collection_id]
def changeset(community, attrs) do
community
|> cast(attrs, @required_fields ++ @optional_fields)
|> validate_required(@required_fields)
|> validate_number(:level, greater_than_or_equal_to: 0)
|> validate_number(:change_count, greater_than_or_equal_to: 0)
|> foreign_key_constraint(:collection_id)
end
end