| | """
|
| | GraphQL Schema for Cancer Data
|
| | """
|
| |
|
| | import strawberry
|
| | from typing import List, Optional
|
| | from .db_manager import DatabaseManager
|
| | import logging
|
| |
|
| | logger = logging.getLogger(__name__)
|
| |
|
| |
|
| | @strawberry.type
|
| | class Gene:
|
| | gene_id: str
|
| | symbol: str
|
| | name: Optional[str] = None
|
| | chromosome: Optional[str] = None
|
| | start_position: Optional[int] = None
|
| | end_position: Optional[int] = None
|
| | gene_type: Optional[str] = None
|
| |
|
| |
|
| | @strawberry.type
|
| | class Mutation:
|
| | mutation_id: str
|
| | chromosome: str
|
| | position: int
|
| | reference: str
|
| | alternate: str
|
| | consequence: Optional[str] = None
|
| | variant_type: Optional[str] = None
|
| | quality: Optional[float] = None
|
| |
|
| |
|
| | @strawberry.type
|
| | class Patient:
|
| | patient_id: str
|
| | project_id: str
|
| | age: Optional[int] = None
|
| | gender: Optional[str] = None
|
| | race: Optional[str] = None
|
| | vital_status: Optional[str] = None
|
| |
|
| |
|
| | @strawberry.type
|
| | class CancerType:
|
| | cancer_type_id: str
|
| | name: str
|
| | tissue: Optional[str] = None
|
| | disease_type: Optional[str] = None
|
| |
|
| |
|
| | @strawberry.type
|
| | class MutationFrequency:
|
| | mutation_id: str
|
| | patients_with_mutation: int
|
| | total_patients: int
|
| | frequency: float
|
| |
|
| |
|
| | @strawberry.type
|
| | class CancerStatistics:
|
| | cancer_type: str
|
| | total_patients: int
|
| | total_mutations: int
|
| | avg_mutations_per_patient: float
|
| |
|
| |
|
| | @strawberry.type
|
| | class Query:
|
| | @strawberry.field
|
| | def gene(self, symbol: str) -> Optional[Gene]:
|
| | """Get gene by symbol"""
|
| | db = DatabaseManager()
|
| | from .db_manager import GeneRepository
|
| | repo = GeneRepository(db)
|
| | gene_data = repo.get_gene_by_symbol(symbol)
|
| | db.close()
|
| |
|
| | if gene_data:
|
| | return Gene(**gene_data)
|
| | return None
|
| |
|
| | @strawberry.field
|
| | def genes(self, limit: int = 100) -> List[Gene]:
|
| | """Get all genes"""
|
| | db = DatabaseManager()
|
| | query = "MATCH (g:Gene) RETURN g LIMIT $limit"
|
| | results = db.execute_query(query, {'limit': limit})
|
| | db.close()
|
| |
|
| | return [Gene(**r['g']) for r in results]
|
| |
|
| | @strawberry.field
|
| | def mutations(
|
| | self,
|
| | gene: Optional[str] = None,
|
| | chromosome: Optional[str] = None,
|
| | limit: int = 100
|
| | ) -> List[Mutation]:
|
| | """Get mutations, optionally filtered by gene or chromosome"""
|
| | db = DatabaseManager()
|
| |
|
| | if gene:
|
| | query = """
|
| | MATCH (g:Gene {symbol: $gene})<-[:AFFECTS]-(m:Mutation)
|
| | RETURN m
|
| | LIMIT $limit
|
| | """
|
| | params = {'gene': gene, 'limit': limit}
|
| | elif chromosome:
|
| | query = """
|
| | MATCH (m:Mutation {chromosome: $chromosome})
|
| | RETURN m
|
| | LIMIT $limit
|
| | """
|
| | params = {'chromosome': chromosome, 'limit': limit}
|
| | else:
|
| | query = "MATCH (m:Mutation) RETURN m LIMIT $limit"
|
| | params = {'limit': limit}
|
| |
|
| | results = db.execute_query(query, params)
|
| | db.close()
|
| |
|
| | return [Mutation(**r['m']) for r in results]
|
| |
|
| | @strawberry.field
|
| | def patients(
|
| | self,
|
| | project_id: Optional[str] = None,
|
| | cancer_type: Optional[str] = None,
|
| | limit: int = 100
|
| | ) -> List[Patient]:
|
| | """Get patients, optionally filtered"""
|
| | db = DatabaseManager()
|
| |
|
| | if project_id:
|
| | query = """
|
| | MATCH (p:Patient {project_id: $project_id})
|
| | RETURN p
|
| | LIMIT $limit
|
| | """
|
| | params = {'project_id': project_id, 'limit': limit}
|
| | elif cancer_type:
|
| | query = """
|
| | MATCH (p:Patient)-[:DIAGNOSED_WITH]->(c:CancerType {cancer_type_id: $cancer_type})
|
| | RETURN p
|
| | LIMIT $limit
|
| | """
|
| | params = {'cancer_type': cancer_type, 'limit': limit}
|
| | else:
|
| | query = "MATCH (p:Patient) RETURN p LIMIT $limit"
|
| | params = {'limit': limit}
|
| |
|
| | results = db.execute_query(query, params)
|
| | db.close()
|
| |
|
| | return [Patient(**r['p']) for r in results]
|
| |
|
| | @strawberry.field
|
| | def cancer_types(self) -> List[CancerType]:
|
| | """Get all cancer types"""
|
| | db = DatabaseManager()
|
| | query = "MATCH (c:CancerType) RETURN c"
|
| | results = db.execute_query(query)
|
| | db.close()
|
| |
|
| | return [CancerType(**r['c']) for r in results]
|
| |
|
| | @strawberry.field
|
| | def mutation_frequency(self, mutation_id: str) -> Optional[MutationFrequency]:
|
| | """Get frequency of a mutation across all patients"""
|
| | db = DatabaseManager()
|
| | from .db_manager import MutationRepository
|
| | repo = MutationRepository(db)
|
| | freq_data = repo.get_mutation_frequency(mutation_id)
|
| | db.close()
|
| |
|
| | if freq_data:
|
| | return MutationFrequency(**freq_data)
|
| | return None
|
| |
|
| | @strawberry.field
|
| | def cancer_statistics(self, cancer_type_id: str) -> Optional[CancerStatistics]:
|
| | """Get statistics for a cancer type"""
|
| | db = DatabaseManager()
|
| | from .db_manager import CancerTypeRepository
|
| | repo = CancerTypeRepository(db)
|
| | stats = repo.get_statistics(cancer_type_id)
|
| | db.close()
|
| |
|
| | if stats:
|
| | return CancerStatistics(**stats)
|
| | return None
|
| |
|
| |
|
| | schema = strawberry.Schema(query=Query)
|
| |
|