Round of 16 Challenge: Knowledge Flow Graph - India 🇮🇳

:trophy: GraphAcademy Cup Submission — Round of 16


GraphAcademy Cup Team Profile Link

Team Profile Link: https://cup.graphacademy.neo4j.com/teams/country-in


GraphAcademy Public Profile Username

Public Profile Username: @venkatasaiprasadp


Country

Country: India :india:


Courses Completed

  • :white_check_mark: Building Knowledge Graphs with LLMs (1h)
  • :white_check_mark: Importing CSV Data into Neo4j (1h)
  • :white_check_mark: Cypher Indexes and Constraints (2h)
  • :white_check_mark: Introduction to Vector Indexes and Unstructured Data (1h)
  • :white_check_mark: Constructing Knowledge Graphs with Neo4j GraphRAG for Python (2h)

Project Name

Knowledge Flow Graph — Real-Time Research-to-Patent Innovation Tracker


Project Description (32–320 words)

Academic research doesn't stay in journals—it flows into patents, companies, and products. But that flow is invisible, scattered across Semantic Scholar, USPTO, and Crossref. I built the Knowledge Flow Graph to make that journey visible in a live Neo4j AuraDB graph.

The system fetches real papers from OpenAlex (citations, authors, institutions, topics, funders), enriches authors with h-index data from Semantic Scholar, pulls real patents from the USPTO Open Data Portal, and seeds everything into a property graph that traces the full innovation chain:

Researcher → Paper → Patent → Company

A FastAPI backend serves 8 live analytics endpoints—knowledge flow chains, topic bridges between academia and industry, researcher impact scores, and company IP portfolios—backed by Cypher queries over the graph. An interactive vis.js dashboard makes it explorable without writing a single line of Cypher.

The Rule of 16 shaped the entire design: exactly 16 node labels, 16 relationship types, 16 user-created indexes + constraints, 16 source CSV files, and 16 properties on both the most data-rich node (Paper) and relationship (AUTHORED_BY). Every limit was hit precisely—not by accident, but by deliberate modeling.

Live: https://knowledge-flow-graph.onrender.com

GitHub: GitHub - Sai6522/knowledge_graph · GitHub


How Your Project Stays Within the Rule of 16 Maximums

Rule Limit This Project Status
Node labels ≤ 16 16 — Paper, Researcher, University, Patent, Company, Topic, Keyword, Funder, Journal, Field, Subfield, Country, Inventor, TechClass, CitationBand, InnovationChain :white_check_mark: Exactly at limit
Relationship types ≤ 16 16 — AUTHORED_BY, COVERS, TAGGED, FUNDED_BY, LED_TO, CITES, RELATES_TO, OWNED_BY, AFFILIATED_WITH, PUBLISHED_IN, BELONGS_TO, PART_OF, LOCATED_IN, INVENTED_BY, IN_BAND, CLASSIFIED_AS :white_check_mark: Exactly at limit
Max properties on any node ≤ 16 16 on Paper node :white_check_mark: Exactly at limit
Max properties on any relationship ≤ 16 16 on AUTHORED_BY :white_check_mark: Exactly at limit
Indexes + constraints combined ≤ 16 16 (6 constraints + 2 fulltext indexes + 8 range indexes) :white_check_mark: Exactly at limit
Source files ≤ 16 16 CSV files :white_check_mark: Exactly at limit

Every single maximum is hit at exactly 16. The Rule of 16 didn't constrain the project—it defined it.

The 16 CSV Source Files

papers.csv
researchers.csv
patents.csv
companies.csv
topics.csv
journals.csv
tech_classes.csv
citation_bands.csv
knowledge_flow.csv
rel_authored_by.csv
rel_belongs_to.csv
rel_classified_as.csv
rel_in_band.csv
rel_led_to.csv
rel_owned_by.csv
rel_published_in.csv

The 6 Uniqueness Constraints

CREATE CONSTRAINT paper_id FOR (p:Paper) REQUIRE p.paperId IS UNIQUE;
CREATE CONSTRAINT researcher_id FOR (r:Researcher) REQUIRE r.researcherId IS UNIQUE;
CREATE CONSTRAINT patent_id FOR (pt:Patent) REQUIRE pt.patentId IS UNIQUE;
CREATE CONSTRAINT company_nm FOR (c:Company) REQUIRE c.name IS UNIQUE;
CREATE CONSTRAINT topic_nm FOR (t:Topic) REQUIRE t.name IS UNIQUE;
CREATE CONSTRAINT university_nm FOR (u:University) REQUIRE u.name IS UNIQUE;

The 10 Indexes (2 fulltext + 8 range)

CREATE FULLTEXT INDEX paper_fulltext FOR (p:Paper) ON EACH [p.title, p.abstract];
CREATE FULLTEXT INDEX patent_fulltext FOR (pt:Patent) ON EACH [pt.title, pt.abstract];
CREATE INDEX paper_year_idx FOR (p:Paper) ON (p.year);
CREATE INDEX paper_cites_idx FOR (p:Paper) ON (p.citationCount);
CREATE INDEX paper_id FOR (p:Paper) ON (p.paperId);
CREATE INDEX patent_id FOR (pt:Patent) ON (pt.patentId);
CREATE INDEX researcher_id FOR (r:Researcher) ON (r.researcherId);
CREATE INDEX topic_nm FOR (t:Topic) ON (t.name);
CREATE INDEX company_nm FOR (c:Company) ON (c.name);
CREATE INDEX university_nm FOR (u:University) ON (u.name);

Screenshots

Data Model Diagram

(16 node labels × 16 relationship types — full innovation chain)

Core chain:

(Researcher)-[:AUTHORED_BY]->(Paper)-[:LED_TO]->(Patent)-[:OWNED_BY]->(Company)
(Researcher)-[:AFFILIATED_WITH]->(University)-[:LOCATED_IN]->(Country)
(Paper)-[:COVERS]->(Topic)<-[:RELATES_TO]-(Patent)
(Paper)-[:TAGGED]->(Keyword)
(Paper)-[:FUNDED_BY]->(Funder)
(Paper)-[:PUBLISHED_IN]->(Journal)
(Paper)-[:BELONGS_TO]->(Field)
(Paper)-[:BELONGS_TO]->(Subfield)-[:PART_OF]->(Field)
(Paper)-[:IN_BAND]->(CitationBand)
(Patent)-[:INVENTED_BY]->(Inventor)
(Patent)-[:CLASSIFIED_AS]->(TechClass)
(Field)-[:CLASSIFIED_AS]->(TechClass)
(InnovationChain)

API /health Response

{
  "status": "ok",
  "nodes": [
    { "label": "Researcher", "total": 128 },
    { "label": "Keyword", "total": 120 },
    { "label": "Inventor", "total": 118 },
    { "label": "Topic", "total": 76 },
    { "label": "University", "total": 51 },
    { "label": "Funder", "total": 45 },
    { "label": "Paper", "total": 33 },
    { "label": "Journal", "total": 24 },
    { "label": "Patent", "total": 18 },
    { "label": "Company", "total": 17 },
    { "label": "Country", "total": 16 },
    { "label": "Subfield", "total": 14 },
    { "label": "Field", "total": 9 },
    { "label": "TechClass", "total": 6 },
    { "label": "InnovationChain", "total": 6 },
    { "label": "CitationBand", "total": 5 }
  ],
  "relationships": [
    { "rel": "INVENTED_BY", "total": 354 },
    { "rel": "TAGGED", "total": 163 },
    { "rel": "COVERS", "total": 135 },
    { "rel": "AUTHORED_BY", "total": 129 },
    { "rel": "AFFILIATED_WITH", "total": 116 },
    { "rel": "LED_TO", "total": 90 },
    { "rel": "BELONGS_TO", "total": 66 },
    { "rel": "FUNDED_BY", "total": 58 },
    { "rel": "LOCATED_IN", "total": 51 },
    { "rel": "PUBLISHED_IN", "total": 33 },
    { "rel": "IN_BAND", "total": 33 },
    { "rel": "CLASSIFIED_AS", "total": 21 },
    { "rel": "RELATES_TO", "total": 18 },
    { "rel": "OWNED_BY", "total": 18 },
    { "rel": "PART_OF", "total": 14 },
    { "rel": "CITES", "total": 11 }
  ]
}

Summary

  • Status: :white_check_mark: ok
  • Node Labels: 16 (Rule of 16 compliant)
  • Relationship Types: 16 (Rule of 16 compliant)

This /health endpoint verifies that the graph is successfully loaded into Neo4j and that all 16 node labels and 16 relationship types required by the Rule of 16 are present.


GitHub / Demo URL


Dataset URL

Source What it provides
OpenAlex Papers, authors, institutions, citations, topics, funders
Semantic Scholar Author h-index enrichment
Crossref DOI, publisher, journal metadata
USPTO Open Data Portal Patent data

Exported CSVs from the live graph are in data/csv/ (16 files).


Additional Notes

The Rule of 16 forced a modeling decision I would have avoided otherwise: do I need a separate Subfield node, or can I just store it as a property on Field?

The answer was yes, because Subfield → PART_OF → Field is a first-class traversal that powers domain rollup queries.

The Processing courses shaped the design:

  • Importing CSV Data into Neo4j taught that well-designed CSVs make LOAD CSV imports straightforward.
  • Building Knowledge Graphs with LLMs showed that paper abstracts are knowledge graphs waiting to be extracted.

The fulltext indexes (paper_fulltext and patent_fulltext) make /paper-search instant by enabling graph search over LLM-extracted topics.

Next step: Add an LLM query layer so researchers can ask:

"Which companies are commercialising CRISPR research from MIT?"

and receive graph-traversal answers.


:white_check_mark: Submission Checklist

  • Participating in the GraphAcademy Cup
  • Included Team Profile Link
  • Included GraphAcademy Public Profile Username
  • Profile is public
  • Project is related to GraphAcademy concepts
  • Completed at least 2 Processing courses
  • Project stays within all Rule of 16 maximums

:scroll: Contest Reminder

:wrapped_gift: One LEGO prize winner will be selected every week during the GraphAcademy Cup.

Terms & Conditions

FAQ

3 Likes