| |
| from streamlit_agraph import Node, Edge, Config |
| import re |
|
|
| def build_agraph(papers, umls, drug_safety, umls_relations=None): |
| nodes, edges = [], [] |
|
|
| |
| for c in umls: |
| cui, name = c.get("cui"), c.get("name") |
| types = c.get("types", []) |
| if not cui or not name: |
| continue |
| label = f"{name}\n({'/'.join(types)})" |
| size = 20 + int(c.get("score",0)*30) |
| nodes.append(Node( |
| id=f"cui_{cui}", |
| label=label, |
| size=size, |
| color="#00b894", |
| tooltip=c.get("definition","") |
| )) |
|
|
| |
| if umls_relations: |
| for rels in umls_relations: |
| for r in rels: |
| s, t = f"cui_{r['cui']}", f"cui_{r['cui2']}" |
| if s != t: |
| edges.append(Edge(source=s, target=t, label=r["label"])) |
|
|
| |
| for i,p in enumerate(papers): |
| pid = f"paper_{i}" |
| nodes.append(Node( |
| id=pid, label=f"P{i+1}", size=15, color="#0984e3", |
| tooltip=p.get("title","") |
| )) |
| txt = (p.get("title","") + " " + p.get("summary","")).lower() |
| for c in umls: |
| if c.get("name","").lower() in txt: |
| edges.append(Edge(source=pid, target=f"cui_{c['cui']}", label="mentions")) |
|
|
| |
| |
|
|
| cfg = Config( |
| width="100%", height="600px", directed=True, |
| nodeHighlightBehavior=True, highlightColor="#f1c40f", |
| collapsible=True, node={"labelProperty":"label"} |
| ) |
| return nodes, edges, cfg |
|
|