mgbam commited on
Commit
a392df0
·
verified ·
1 Parent(s): 79daf3f

Update mcp/knowledge_graph.py

Browse files
Files changed (1) hide show
  1. mcp/knowledge_graph.py +38 -56
mcp/knowledge_graph.py CHANGED
@@ -1,61 +1,43 @@
1
  # mcp/knowledge_graph.py
2
 
3
- from pyvis.network import Network
4
- import tempfile
5
- import jinja2
6
- assert jinja2.Environment is not None
7
 
8
- def build_knowledge_graph(papers, umls, drugs):
9
  """
10
- Build and return a pyvis Network object representing the knowledge graph.
11
- Nodes: papers, UMLS concepts, drugs.
12
- Edges: paper–concept, paper–drug, drug–concept.
13
  """
14
- net = Network(height="550px", width="100%", bgcolor="#f3eaff", font_color="#222222", notebook=False, directed=False)
15
- net.force_atlas_2based() # More visually appealing layout
16
-
17
- # Add UMLS concept nodes
18
- concept_nodes = {}
19
- for concept in umls:
20
- if concept["cui"]:
21
- node_id = f"concept_{concept['cui']}"
22
- net.add_node(node_id, label=concept["name"], color="#00b894", title=f"UMLS: {concept['cui']}\n{concept['definition'] or ''}")
23
- concept_nodes[concept['name']] = node_id
24
-
25
- # Add drug nodes
26
- drug_nodes = {}
27
- for drug_report in drugs:
28
- if isinstance(drug_report, list):
29
- # OpenFDA can return a list of dicts
30
- for d in drug_report:
31
- if "safety_report_id" in d:
32
- node_id = f"drug_{d['safety_report_id']}"
33
- drug_name = d.get('reactions', ['drug'])[0] if d.get('reactions') else 'drug'
34
- net.add_node(node_id, label=drug_name, color="#d35400", title=str(d))
35
- drug_nodes[drug_name] = node_id
36
-
37
- # Add paper nodes and edges to concepts and drugs
38
- for i, paper in enumerate(papers, 1):
39
- paper_id = f"paper_{i}"
40
- net.add_node(paper_id, label=paper["title"][:40] + "...", color="#0984e3", title=f"{paper['title']}\n{paper['summary']}\n{paper['link']}")
41
-
42
- # Link paper to concepts by presence in summary/title
43
- for cname, concept_id in concept_nodes.items():
44
- if cname.lower() in (paper["summary"] + paper["title"]).lower():
45
- net.add_edge(paper_id, concept_id, color="#00b894")
46
-
47
- # Link paper to drugs if drug name is present in summary/title
48
- for dname, drug_id in drug_nodes.items():
49
- if dname.lower() in (paper["summary"] + paper["title"]).lower():
50
- net.add_edge(paper_id, drug_id, color="#d35400")
51
-
52
- # Optionally: link concepts to drugs if name overlap
53
- for cname, concept_id in concept_nodes.items():
54
- for dname, drug_id in drug_nodes.items():
55
- if cname.lower() in dname.lower() or dname.lower() in cname.lower():
56
- net.add_edge(concept_id, drug_id, color="#636e72")
57
-
58
- # Save and return path to HTML
59
- temp_path = tempfile.NamedTemporaryFile(delete=False, suffix=".html").name
60
- net.show(temp_path)
61
- return temp_path
 
1
  # mcp/knowledge_graph.py
2
 
3
+ from streamlit_agraph import agraph, Node, Edge, Config
 
 
 
4
 
5
+ def build_agraph(papers, umls, drugs):
6
  """
7
+ Build nodes and edges for streamlit-agraph visualization.
 
 
8
  """
9
+ nodes, edges = [], []
10
+
11
+ # Map concepts
12
+ for c in umls:
13
+ if c.get("cui"):
14
+ cid = f"concept_{c['cui']}"
15
+ nodes.append(Node(id=cid, label=c["name"], size=25, color="#00b894"))
16
+
17
+ # Map drugs
18
+ for i, drug_report in enumerate(drugs):
19
+ if drug_report:
20
+ did = f"drug_{i}"
21
+ dname = drug_report.get("drug_name", f"drug_{i}")
22
+ nodes.append(Node(id=did, label=dname, size=25, color="#d35400"))
23
+
24
+ # Map papers
25
+ for i, p in enumerate(papers):
26
+ pid = f"paper_{i}"
27
+ nodes.append(Node(id=pid, label=f"P{i+1}", tooltip=p["title"], size=15, color="#0984e3"))
28
+ # connect to concepts
29
+ for c in umls:
30
+ if c["name"].lower() in (p["title"] + p["summary"]).lower():
31
+ edges.append(Edge(source=pid, target=f"concept_{c['cui']}", label="mentions"))
32
+ # connect to drugs
33
+ for j, drug_report in enumerate(drugs):
34
+ dname = drug_report.get("drug_name", "")
35
+ if dname and dname.lower() in (p["title"] + p["summary"]).lower():
36
+ edges.append(Edge(source=pid, target=f"drug_{j}", label="mentions"))
37
+
38
+ config = Config(
39
+ width="100%", height="600", directed=False,
40
+ nodeHighlightBehavior=True, highlightColor="#f0a",
41
+ collapsible=True
42
+ )
43
+ return nodes, edges, config