我是neo4j中的菜鸟,我的问题看起来很简单。 我有CSV文件,下一个结构:
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。
建议非常感谢。
答案 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)