创建唯一节点并制作具有多个值的标签
Create unique nodes and make labels with multiple values
我是 neo4j 菜鸟,我的问题看起来很简单。
我有 CSV 文件,具有下一个结构:
Id是Persons ID,Fam是project 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与多标签建立关系。
非常感谢您的建议。
我相信您从表格和当前数据的角度考虑得太多了,所以您错过了您想要建模的大局。使用图形数据库,更容易根据实体(您正在建模的重要"things")和它们之间的关系来思考。
我认为这是您描述中最重要的部分:
"Id is a Persons ID, and Fam is a project ID, where this person took
part. I want to connect persons if they worked on the same project."
您提到的重要 "things" 是人员和项目。所以在我看来,这些是您应该使用的标签: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 连接到 :他们从事的项目。
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);
有了这个之后,查询 :Persons who worked on the same :Project 应该很容易,而且您不需要为此加载 CSV。
编辑
要在从事相同 :Project 的 :Persons 之间创建 :KNOWS 关系,您可以使用此查询:
MATCH (p1:Person)-[:WORKED_ON]->(:Project)<-[:WORKED_ON]-(p2:Person)
WITH DISTINCT p1, p2
MERGE (p1)-[:KNOWS]-(p2)
我是 neo4j 菜鸟,我的问题看起来很简单。
我有 CSV 文件,具有下一个结构:
Id是Persons ID,Fam是project 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与多标签建立关系。
非常感谢您的建议。
我相信您从表格和当前数据的角度考虑得太多了,所以您错过了您想要建模的大局。使用图形数据库,更容易根据实体(您正在建模的重要"things")和它们之间的关系来思考。
我认为这是您描述中最重要的部分:
"Id is a Persons ID, and Fam is a project ID, where this person took part. I want to connect persons if they worked on the same project."
您提到的重要 "things" 是人员和项目。所以在我看来,这些是您应该使用的标签: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 连接到 :他们从事的项目。
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);
有了这个之后,查询 :Persons who worked on the same :Project 应该很容易,而且您不需要为此加载 CSV。
编辑
要在从事相同 :Project 的 :Persons 之间创建 :KNOWS 关系,您可以使用此查询:
MATCH (p1:Person)-[:WORKED_ON]->(:Project)<-[:WORKED_ON]-(p2:Person)
WITH DISTINCT p1, p2
MERGE (p1)-[:KNOWS]-(p2)