neo4j - 创建具有相同类型的节点的更好方法

时间:2016-07-27 16:15:12

标签: neo4j

我是neo4j的新手。我正在编写一个脚本,可以将记录从MySQL导入neo4j。我想知道创建具有相同类型的节点的更好方法。我创建了与相关的节点,请考虑以下代码段:

CREATE (Like:like_1 { 'node_type:"likes", like_name:"abc" })
CREATE (Like:like_2 { 'node_type:"likes", like_name:"def" })
CREATE (Like:like_3 { 'node_type:"likes", like_name:"ghi" })

我以类似的方式创建了用户

CREATE (User:user_1 { 'node_type:"user", user_name:"alpha" })
CREATE (User:user_2 { 'node_type:"user", user_name:"beta" })
CREATE (User:user_3 { 'node_type:"user", user_name:"gamma" })

因此,创建了总共6个节点,其中,(like_ n 和user_ n n id( SQL记录的主键)。我想,这对于检索更好,这样我就知道节点的标签(喜欢_后跟id)。

MATCH (l:like_1) RETURN l

上面创建的节点的方式更好吗?或者我应该使用以下(替代)模式,其中我将id作为属性放在节点中:

CREATE (Like:like { 'node_type:"likes", like_name:"abc", like_id:"1" })
CREATE (Like:like { 'node_type:"likes", like_name:"def", like_id:"2" })
CREATE (Like:like { 'node_type:"likes", like_name:"ghi", like_id:"3" })
CREATE (User:user { 'node_type:"user", like_name:"alpha", user_id:"1" })
CREATE (User:user { 'node_type:"user", like_name:"beta", user_id:"2" })
CREATE (User:user { 'node_type:"user", like_name:"gamma", user_id:"3" })

使用相同的方案,如果第二个apparoach更好,我怎样才能在两个user_1和所有likes之间建立关系并检索它?

1 个答案:

答案 0 :(得分:2)

我认为您需要重新阅读Cypher开发指南的部分内容,或者至少重新阅读节点标签上的部分内容,并在查询中使用变量。

简而言之,语法为(variableName:nodeLabel {<params>})

nodeLabel相当于关系数据库中的类型或表,因此将User作为节点标签,而不是user_1是有意义的。

variableName仅在查询期间持续。它将元素(或元素)绑定到该变量,以便稍后在查询中使用。如果您不打算在查询的其余部分中使用该变量,请不要使用变量。

对于唯一标识符(例如您的id主键),您需要将其设置为节点上的属性,并另外在该标签/属性组合上创建一个唯一约束(这相当于一个唯一约束)表中的一列)。

至于喜欢......我必须问一下,作为一个节点,还是作为一种关系,是否会更有意义?用户是否喜欢彼此(和其他东西)? Like是如何适应您的数据模型的?

您可能希望绘制或引用实体关系图或类似内容,而不是仅查看您的数据库并尝试将其直接转换为neo4j。在neo4j中,物理模型是逻辑模型,因此从图表到实际数据库应该很容易。

例如,假设将Likes建模为用户之间的关系更有意义。你可以这样做:

MERGE (user1:User { id:1, name:"alpha" })
MERGE (user2:User { id:2, name:"beta" })
MERGE (user1)-[:Likes]->(user2)

在上面我使用MERGE而不是CREATE,这样如果我再次运行它,它将不会创建重复的节点或关系(你会想要阅读MERGE,它很有用但很棘手,你会通常想要零碎地使用它,而不是整个模式)。我创建的节点是具有:User标签的节点。 id是一个属性(在执行任何创建脚本之前,您确实应该在User标签的id属性上创建约束)。创建两个节点后,我们创建它们之间的关系。

另一种方法是将它们分开,而不是一次性创建节点和标签。如果您在单独的表格中跟踪您的喜欢,这也是有意义的。

您可以类似地创建节点,但没有变量,如下所示:

MERGE (:User { id:1, name:"alpha" })
MERGE (:User { id:2, name:"beta" })

在单独的查询中,添加Likes关系,假设您拥有用户的ID并假设对用户的ID有唯一约束:

MATCH (aUser:User{ id:1})
MATCH (bUser:User{ id:2})
MERGE (aUser)-[:Likes]->(bUser)

请记住,变量只是在查询期间的范围内,以帮助您在查询中的其他位置引用和使用已定义的元素。