PK和FK之间的neo4j关系

时间:2016-10-21 05:41:06

标签: neo4j

我有两个csv文件,第一个就像

movies.csv

  

movieId |标题|流派

links.csv

  

movieId | tmdbId | imdbId

我尝试过这个密码查询

 USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM "file:///links.csv" AS row
WITH row
MATCH (movie:Movie {id: toInt(row.movieId)})
MERGE (link)-[r:LINK]->(movie)
ON CREATE SET r.tmdbId = toInt(row.tmdbId)

这对我来说没有用,它没有创造新标签" LINK"或正确形成关系, 我希望能够在我有一个movieId来获得相应的tmdbId 我已经尝试了几种方法,但没有一种方法有效,我对neo4k不熟悉并且仍熟悉sql

1 个答案:

答案 0 :(得分:1)

您对link的使用是作为变量,而不是标签(如果您想使用该标签创建新节点,则可以使用:Link),并且它不是很清楚您的链接应该是什么,因为您没有任何ID或任何属性。它还不清楚您需要其他节点,因为电影节点可以轻松拥有相关ID的属性(因此您可以通过其movieId查找:Movie节点,然后从该节点获取tmdbId)。

如果您可以提供有关用例的更多详细信息,以及您希望建模的内容以及它的连接方式,那么这将有所帮助。

修改

好的,这听起来像你正在建模:电影,你也想要:链接节点同时包含tmdbId和imdbId属性。如上所述,实际上你应该只设置:Movie节点本身的属性,而不是打扰:链接节点,但这是为了习惯neo4j,所以没关系。

首先,为了确保我们的匹配在构建这些关系时速度很快,我们需要通过其唯一ID对节点进行唯一约束。

CREATE CONSTRAINT ON (m:Movie)
       ASSERT m.id IS UNIQUE

CREATE CONSTRAINT ON (l:Link)
       ASSERT l.tmdbId IS UNIQUE

CREATE CONSTRAINT ON (l:Link)
       ASSERT l.imdbId IS UNIQUE

您的导入将是:

USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM "file:///links.csv" AS row
WITH row
MATCH (movie:Movie {id: toInt(row.movieId)})
MERGE (link:Link{imdbId: toInt(row.imdbId), tmdbId: toInt(row.tmdbId)})
MERGE (link)-[:LINK]->(movie)

用一个id获取电影的查询是:

MATCH (link:Link)-[:LINK]->(movie:Movie)
WHERE link.imdbId = 123
RETURN movie

您应该能够推断出相反方向的查询,从movieId开始并遍历:LINK关系到:Link节点(您可能希望更改其中一个,因为节点具有相同的名称标签和关系类型可能会让您感到困惑,因为您需要获取相关ID。