Neo4j - 关系建模问题

时间:2018-06-05 16:58:38

标签: neo4j cypher

我有两个从mysql导出的CSV文件:

#Disease CSV标头#    疾病大师    ID(自动增量,pk)    disease_name

#测试CSV标头#    测试大师    ID(自动增量,pk),    TEST_NAME,    parent_disease_ID(指向疾病中的ID列。
    大师tbl)

我运行以下cypher命令:

    LOAD CSV WITH HEADERS FROM.   
   "http://localhost/disease_mstr.csv" AS line
    MERGE (d:Disease {did: toInteger(line.ID),  diseasename: 
    line.disease_name})

    LOAD CSV WITH HEADERS FROM.  
   "http://localhost/test_mstr.csv" AS line
    MERGE (d:Tests {tid: toInteger(line.ID),  testname: 
    line.test_name, did: toInteger(line.parent_disease_ID)})

   MATCH (t:Tests), (d:Disease) CREATE (t:Tests)- 
   [r:TEST_FOR]->(d:Disease) RETURN t, r, d

以上cypher返回一种与许多测试相关的疾病,而我只想反过来!有人可以纠正我吗?

2 个答案:

答案 0 :(得分:1)

您可以在测试文件的一次传递中创建疾病节点,测试节点以及测试和疾病节点之间的关系。

LOAD CSV WITH HEADERS 
FROM "http://localhost/test_mstr.csv" 
AS line
MERGE (disease:Disease {did: toInteger(line.parent_disease_ID)})
MERGE (test:Tests {tid: toInteger(line.ID), testname: 
line.test_name})
MERGE (test)-[r:TEST_FOR]->(did)

然后在第二次传递后更新疾病名称。

LOAD CSV WITH HEADERS 
FROM "http://localhost/disease_mstr.csv" AS line
MERGE (d:Disease {did: toInteger(line.ID)})
SET d.diseasename = line.disease_name

答案 1 :(得分:0)

[EDITED]

在创建关系的查询中,您需要筛选共享相同Tests值的Diseasedid个节点:

MATCH (t:Tests), (d:Disease)
WHERE t.did = d.did
MERGE (t)-[r:TEST_FOR]->(d)
RETURN t, r, d;

此查询还将CREATE替换为MERGE,以避免在同一TEST_FORt对之间创建重复的d关系。如果您已经有这样的重复关系,请先删除它们。

另外,为了提高效率,您应该考虑在:Disease(did):Tests(did)index创建 - 以最多的实例为准。