Neo4j连接多个节点之间的多个关系

时间:2018-06-07 08:39:47

标签: neo4j cypher neo4j-node

我正在尝试实现此处显示的内容: 我有2个CSV文件,diease_mstr和Test_mstr现在在Test_mstr中,我对疾病ID记录进行了很多测试,这意味着它们都不是唯一的。疾病ID指向disease_mstr文件。在disease_mstr文件中,我只有2个字段,ID和Disease_name(疾病名称是唯一的)。

现在,我正在使用标签创建3个节点 1)测试(仅“testname”属性),它将具有唯一的测试(总共345个独特的测试名称)

**Properties :**
a) testname

2)Linknode(拉出整个Test_mstr文件)还从Disease_mstr文件中提取相应的disease_ID的“disease_name”

**Properties**
a)tname
b)dname
c)did

3)疾病(拉动疾病_mstr)文件。

**Properties**
a)did
b)diseasename

之后我运行创建关系

1)MATCH (t:Tests),(n:Linknode) where t.testname = n.tname CREATE (n)-[r:TEST_2]->(t) RETURN n,r,t

2)MATCH (d:Disease), (l:Linknode) where d.did = l.did MERGE (d)-[r:FOR_DISEASE]->(l) RETURN d,r,l

为了获得如图所示的所需结果,我运行以下cypher命令:

MATCH (d:Disease)-[r2:FOR_DISEASE]->(l:Linknode)-[r:TEST_2]->(t:Tests) RETURN l,r,t,r2 LIMIT 25

有人可以帮助我创建另外两个关系,这些关系在图像中用蓝色和绿色线条标记和链接吗?

Sample files and images can be accessed in my google folder link

1 个答案:

答案 0 :(得分:0)

您的目标是将所有疾病与测试联系起来,以便对于任何疾病,您可以找出哪些测试是相关的,并且对于每个测试,它测试哪种疾病?

如果是这样,你就在那里。

在将测试与疾病联系起来时,除了帮助您之外,您不需要链接节点。在当前场景中,您正在处理链接节点,就像创建关系数据库一样。它们不会在图形数据库中添加任何值。您可以在疾病和测试之间建立单一关系,这将完成所有工作。

这是加载数据库的一步一步的方法。 (它可能不是最有效的,但它很容易遵循并且有效。)

规范化并加载测试:

load csv with headers from "file:///test_mstr_csv.csv" as line
merge (:Test {testname:line.test_name});

加载你的疾病(这些看起来正常化了我)

load csv with headers from "file:///disease_mstr_csv.csv" as line
create (:Disease {did:line.did, diseasename:line.disease_name});

加载链接节点:

load csv with headers from "file:///test_mstr_csv.csv" as line
merge (:Link {testname:line.test_name, parentdiseaseid:line.parent_disease_ID});

现在,您可以使用以下查询在疾病和测试之间建立直接关系:

match(d:Disease), (l:Link) where d.did = l.parentdiseaseid
with d, l.testname as name
match(t:Test {testname:name}) create (d)<-[:TEST_FOR]-(t);

最后一个查询将找到每种疾病的所有链接节点并提取测试名称。然后它查找测试并将其直接加入到相应的疾病中。

链接节点现在是redundent,因此您可以根据需要删除它们。

要创建'蓝线',我假设它是为了显示测试有共同疾病的位置,请运行以下查询:

match (d:Disease)<-[]-(:Test)-[]->(e:Disease) where id(d) > id(e) 
merge (d)-[:BLUE_LINE]->(e);

匹配子句查找具有常见测试的所有疾病对,其中子句确保仅在一个方向创建链接并且合并子句确保只创建一个链接。