0

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

Id 是 Persons ID,Fam 是项目 ID,此人参与其中。如果他们从事同一个项目,我想联系他们。

在这种情况下,最好的数据模型是什么?我首先想到的是制作 id - 节点和 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 查询,这将使 id 具有多标签。

非常感谢您的建议。

4

1 回答 1

1

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

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

“Id 是 Persons 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

您的导入只会将 :Persons 连接到 :Projects 他们从事的工作。

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)
于 2016-12-04T21:37:14.063 回答