The way the database is setup is like this. I'm using SQLModel, but underneath it's SQLAlchemy.
class Paper(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
similar: List["PaperSimilarLink"] = Relationship(
link_model=PaperSimilarLink,
back_populates="similar",
sa_relationship_kwargs=dict(
primaryjoin="Paper.id==PaperSimilarLink.paper_id",
secondaryjoin="Paper.id==PaperSimilarLink.similar_id",
),
)
class PaperSimilarLink(SQLModel, table=True):
paper_id: int = Field(default=None, foreign_key="paper.id", primary_key=True)
similar_id: int = Field(default=None, foreign_key="paper.id", primary_key=True)
paper: "Paper" = Relationship(
back_populates="similar",
sa_relationship_kwargs=dict(
foreign_keys="[PaperSimilarLink.paper_id]",
),
)
similar: "Paper" = Relationship(
back_populates="similar",
sa_relationship_kwargs=dict(
foreign_keys="[PaperSimilarLink.similar_id]",
),
)
similarity: Optional[float]
The query I am looking for is to look for all the Paper
objects that have less than x number of PaperSimilarLinks located at Paper.similar. I've tried this:
papers = session.exec(select(Paper).where(Paper.similar.count() <= 11)).all()
It errors me out saying AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Paper.similar has an attribute 'count'
I figured this was a very simple query, but it's illuding me! How would I do this?