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

neo4j—创建具有相同类型节点的更好方法,neo4j,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", l

我不熟悉
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是SQL记录的
id
(主键)。我认为,检索更好,这样节点的标签对我来说是已知的(比如u后跟id)

上面创建节点的方式更好吗?或者我应该使用以下(替代)模式,在其中我将
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
和所有
like
之间建立关系并检索它?

我认为您需要重新阅读Cypher dev guide的部分内容,或者至少是关于节点标签的部分,并在查询中使用变量

不过,简而言之,语法是
(variableName:nodeLabel{})

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

variableName仅在查询期间有效。它将元素绑定到该变量,以便稍后在查询中使用。如果您不打算在查询的其余部分中使用变量,那么根本不要使用变量

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

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

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

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

MERGE (user1:User { id:1, name:"alpha" })
MERGE (user2:User { id:2, name:"beta" })
MERGE (user1)-[:Likes]->(user2)
MERGE (:User { id:1, name:"alpha" })
MERGE (:User { id:2, name:"beta" })
在上面的例子中,我使用的是MERGE而不是CREATE,这样如果我再次运行它,它就不会创建重复的节点或关系(您可能希望在MERGE时阅读,这很有用,但很棘手,您通常希望零碎地使用它,而不是整个模式)。我创建的节点是带有:User标签的节点。id是一个属性(在执行任何创建脚本之前,确实应该在用户标签的id属性上创建一个约束)。创建两个节点后,我们创建它们之间的关系

另一种方法是将它们分开,而不是同时创建节点和标签。如果你在一个单独的表中跟踪你喜欢的东西,这也是有意义的

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

MERGE (user1:User { id:1, name:"alpha" })
MERGE (user2:User { id:2, name:"beta" })
MERGE (user1)-[:Likes]->(user2)
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)

请记住,变量仅在查询期间有效,以帮助您在查询的其他地方引用和使用已定义的元素。

谢谢您的详细回答。对于您的问题,将
喜欢的
视为
成分
,用户可能喜欢或不喜欢一种或多种成分。用户之间没有像“喜欢”这样的关系。啊,明白了,希望我的答案仍然有用,即使假设不好。