创建唯一节点并使用多个值创建标签

时间:2016-12-04 18:13:51

标签: neo4j load-csv

我是neo4j中的菜鸟,我的问题看起来很简单。 我有CSV文件,下一个结构: Structure

Id是人员ID,而Fam是项目ID,此人参与其中。 如果他们在同一个项目上工作,我想联系他们。

在这种情况下,最好的数据模型是什么?我想到的第一件事就是制作id - node和Fam标签。但我不知道如何将多个标签加载到一个节点。 其次是将id和Fam作为节点,然后进行查询以显示相关的员工。

对于第二种情况代码将是这样的:

LOAD CSV WITH HEADERS FROM 'file:///PNG20161202.csv' AS line
MERGE (n:id {Person_id: toInt(line.id)})
WITH line, n
MERGE (m:Fam {Fam_id: toInt(line.Fam)})
WITH m,n
MERGE (n)-[:WORK_IN]->(m);

但我不知道如何仅显示相关的ID。 (我需要在Gephi中导出和可视化这个网络,只有id)

对于第一种情况,我知道如何在id之间建立关系,但不知道如何编写LOAD CSV查询,这将使用multilabel生成id。

建议非常感谢。

1 个答案:

答案 0 :(得分:1)

我相信你从表格和当前数据的角度来考虑太多,所以你错过了你想要建模的大局。使用图形数据库,可以更容易地根据实体(您正在建模的重要“事物”)以及它们之间的关系进行思考。

我认为这是您描述中最重要的部分:

  

“我是一个人员ID,而Fam是一个项目ID,这个人就是这个人   部分。如果他们在同一个项目上工作,我想联系他们。“

你提到的重要“事情”是人和项目。所以在我看来,这些是你应该使用的标签,:Person和:Project。 ID往往是唯一的,因此它们应该是以下属性:Person和:Project节点,对标签和ID属性具有唯一约束。

您可以像这样设置唯一约束:

CREATE CONSTRAINT ON (p:Person)
ASSERT p.ID IS UNIQUE

CREATE CONSTRAINT ON (pr:Project)
ASSERT pr.ID IS UNIQUE

您的导入只会连接:人员:他们所处理的项目。

LOAD CSV WITH HEADERS FROM 'file:///PNG20161202.csv' AS line
MERGE (n:Person {ID: toInt(line.id)})
MERGE (m:Project {ID: toInt(line.Fam)})
MERGE (n)-[:WORKED_ON]->(m);

一旦你有这个,就应该很容易查询:工作相同的人:项目,你不需要一个LOAD CSV。

修改

用于创建:KNOWS之间的关系:工作相同的人:项目,您可以使用此查询:

MATCH (p1:Person)-[:WORKED_ON]->(:Project)<-[:WORKED_ON]-(p2:Person)
WITH DISTINCT p1, p2
MERGE (p1)-[:KNOWS]-(p2)