
# ============================================================
# Neo4j 知识图谱导入指南 - DARPA 项目数据
# ============================================================

# 1. 【推荐】neo4j-admin bulk import（最快，适合全量导入）
neo4j-admin database import full neo4j   --nodes=Project=nodes_project.csv   --nodes=Office=nodes_office.csv   --nodes=Technology=nodes_technology.csv   --nodes=Manager=nodes_manager.csv   --nodes=Institution=nodes_institution.csv   --relationships=BELONGS_TO=rels_project_office.csv   --relationships=MANAGED_BY=rels_project_manager.csv   --relationships=USES_TECHNOLOGY=rels_project_technology.csv   --relationships=PARTICIPATED_BY=rels_project_institution.csv   --overwrite-destination=true

# 2. 【备选】Cypher LOAD CSV（适合在线导入，逐步执行）
# ─── 创建约束 ───
CREATE CONSTRAINT FOR (p:Project) REQUIRE p.projectId IS UNIQUE;
CREATE CONSTRAINT FOR (o:Office) REQUIRE o.officeId IS UNIQUE;
CREATE CONSTRAINT FOR (t:Technology) REQUIRE t.techId IS UNIQUE;
CREATE CONSTRAINT FOR (m:Manager) REQUIRE m.managerId IS UNIQUE;
CREATE CONSTRAINT FOR (i:Institution) REQUIRE i.instId IS UNIQUE;

# ─── 导入节点 ───
LOAD CSV WITH HEADERS FROM 'file:///nodes_project.csv' AS row
CREATE (:Project {
  projectId: row['projectId:ID(Project)'],
  nameEn: row.nameEn,
  nameCn: row.nameCn,
  status: row.status,
  startYear: toInteger(row['startYear:int']),
  endYear: toInteger(row['endYear:int']),
  budget: row.budget,
  transferDomain: row.transferDomain
});

LOAD CSV WITH HEADERS FROM 'file:///nodes_office.csv' AS row
CREATE (:Office {officeId: row['officeId:ID(Office)'], name: row.name});

LOAD CSV WITH HEADERS FROM 'file:///nodes_technology.csv' AS row
CREATE (:Technology {techId: row['techId:ID(Technology)'], name: row.name});

LOAD CSV WITH HEADERS FROM 'file:///nodes_manager.csv' AS row
CREATE (:Manager {managerId: row['managerId:ID(Manager)'], name: row.name});

LOAD CSV WITH HEADERS FROM 'file:///nodes_institution.csv' AS row
CREATE (:Institution {instId: row['instId:ID(Institution)'], name: row.name});

# ─── 导入关系 ───
LOAD CSV WITH HEADERS FROM 'file:///rels_project_office.csv' AS row
MATCH (p:Project {projectId: row[':START_ID(Project)']}),
      (o:Office  {officeId:  row[':END_ID(Office)']})
CREATE (p)-[:BELONGS_TO]->(o);

LOAD CSV WITH HEADERS FROM 'file:///rels_project_manager.csv' AS row
MATCH (p:Project {projectId: row[':START_ID(Project)']}),
      (m:Manager {managerId: row[':END_ID(Manager)']})
CREATE (p)-[:MANAGED_BY]->(m);

LOAD CSV WITH HEADERS FROM 'file:///rels_project_technology.csv' AS row
MATCH (p:Project   {projectId: row[':START_ID(Project)']}),
      (t:Technology{techId:    row[':END_ID(Technology)']})
CREATE (p)-[:USES_TECHNOLOGY]->(t);

LOAD CSV WITH HEADERS FROM 'file:///rels_project_institution.csv' AS row
MATCH (p:Project     {projectId: row[':START_ID(Project)']}),
      (i:Institution {instId:    row[':END_ID(Institution)']})
CREATE (p)-[:PARTICIPATED_BY {relationType: row.relationType, remark: row.remark}]->(i);
