我试图从边缘列表创建一个图形数据库,并且我对neo4j有点新意,所以我遇到了这个问题。首先,我得到的边缘列表是这样的:
geneId geneSymbol diseaseId diseaseName score
10 NAT2 C0005695 Bladder Neoplasm 0.245871429880008
10 NAT2 C0013182 Drug Allergy 0.202681755307501
100 ADA C0002170 Alopecia 0.2
100 ADA C0002880 Autoimmune hemolytic anemia 0.2
100 ADA C0004096 Asthma 0.21105290517153
我和生殖疾病之间有很多关系(165k)。
我想创建一个节点是gen或疾病的二分网络,所以我上传这样的数据:
LOAD CSV WITH HEADERS FROM "file:///path/curated_gene_disease_associations.tsv" as row FIELDTERMINATOR '\t'
MERGE (g:Gene{geneId:row.geneId})
ON CREATE SET g.geneSymbol = row.geneSymbol
MERGE (d:Disease{diseaseId:row.diseaseId})
ON CREATE SET d.diseaseName = row.diseaseName
一段时间后(这比使用igraph上传节点所花费的时间长),它完成了,我得到了节点,我使用了MERGE因为我不想重复根/疾病。问题是,我不知道如何建立关系,我已经搜索过他们总是使用像
这样的东西 MATCH (g:Gene {geneId: toInt(row.geneId)}), (d:Disease {diseaseId: toInt(row.geneId)})
CREATE (g)-[:RELATED_TO]->(d);
但是当我运行它时它说没有变化。我已经看过neo4j教程,但是当他们做关系时他们不会使用边缘列表,所以问题可能是当我合并节点以便他们不重复时。我很感激任何帮助!
答案 0 :(得分:1)
您的关系查询可能存在两个问题:
1)您正在插入(可能)作为字符串类型(没有toInt),并将MATCH查询作为整数类型(使用toInt)。
2)你在row.geneId上匹配疾病节点,而不是row.diseaseId。
尝试以下修改:
MATCH (g:Gene {geneId: row.geneId}), (d:Disease {diseaseId: row.diseaseId})
CREATE (g)-[:RELATED_TO]->(d);
答案 1 :(得分:0)
@ DanielKitchener的回答似乎解决了你的主要问题。
关于创建节点的缓慢性,您应该在这些标签/属性对上创建indexes(或uniqueness constraints,这也会自动创建索引):
:Gene(geneId)
:Disease(diseaseId)
例如,分别执行这两个语句:
CREATE INDEX ON :Gene(geneId);
CREATE INDEX ON :Disease(diseaseId);
一旦数据库具有这些索引,您的MERGE
子句应该快得多,因为他们不必扫描所有现有的Gene
或Disease
节点来查找可能的匹配项。< / p>