我可以在neo4j中创建并关联两个名称相同但ID不同的节点吗

我可以在neo4j中创建并关联两个名称相同但ID不同的节点吗,neo4j,cypher,Neo4j,Cypher,我在neo4j中创建了两个具有相同名称和标签但ID不同的节点: CREATE (P:names {id:"1"}) CREATE (P:names{id:"2"}) 我的问题是,我是否可以在这两个节点之间创建如下关系: MATCH (P:names),(P:names) WHERE P.id = "1" AND P.id = "2" CREATE (P)-[r:is_connected_with]->(P) RETURN r" 我试过了,但没用。 是因为我不应该使用相同的名称创建节

我在neo4j中创建了两个具有相同名称和标签但ID不同的节点:

CREATE (P:names {id:"1"})
CREATE (P:names{id:"2"})
我的问题是,我是否可以在这两个节点之间创建如下关系:

MATCH (P:names),(P:names) 
WHERE P.id = "1" AND P.id = "2" 
CREATE (P)-[r:is_connected_with]->(P) RETURN r"
我试过了,但没用。
是因为我不应该使用相同的名称创建节点,还是有一个解决方法?

以下内容如何

首先运行create语句:

CREATE (p1:Node {id:"1"}) // note, named p1 here
CREATE (p2:Node {id:"2"})
然后,进行匹配:

MATCH (pFirst:Node {id:"1"}), (pSecond:Node {id:"2"}) // and here we can call it something else
CREATE pFirst-[r:is_connected_with]->(pSecond)
RETURN r
基本上,将两个节点与标签节点匹配。在你的比赛中,你叫他们p1和p2,但如果你愿意,你可以改变这些标识符。然后,简单地创建它们之间的关系

不应使用相同的名称创建标识符。还要注意,p1和p2不是节点的名称,而是此特定查询中标识符的名称


编辑:从OP输入后,我创建了一个。

以下内容如何

首先运行create语句:

CREATE (p1:Node {id:"1"}) // note, named p1 here
CREATE (p2:Node {id:"2"})
然后,进行匹配:

MATCH (pFirst:Node {id:"1"}), (pSecond:Node {id:"2"}) // and here we can call it something else
CREATE pFirst-[r:is_connected_with]->(pSecond)
RETURN r
基本上,将两个节点与标签节点匹配。在你的比赛中,你叫他们p1和p2,但如果你愿意,你可以改变这些标识符。然后,简单地创建它们之间的关系

不应使用相同的名称创建标识符。还要注意,p1和p2不是节点的名称,而是此特定查询中标识符的名称


编辑:在OP的输入之后,我创建了一个。

@wassgren对如何修复您的查询有正确的答案,但我可能能够填写一些关于原因的详细信息,并且在评论中留下的时间太长

在描述节点或关系时,冒号前面的字符称为标识符,它只是表示密码查询中的节点/rel的变量。Neo4j有一些您没有遵循的命名约定,因此,它使您的查询更难阅读,并且将来也更难获得帮助。最佳做法包括:

标识符以小写字母开头:person而不是Person1,p而不是p 标签是单数的,其第一个字符大写:p1:Name,而不是p1:Name或p1:Name或p1:Name 关系都是大写的,[r:IS\u CONNECTED\u WITH],而不是[r:IS\u CONNECTED\u WITH],尽管这一个一直被打破;- 回到您的查询,它既不起作用,也不符合惯例

不起作用:

MATCH (P:names),(P:names) 
WHERE P.id = "1" AND P.id = "2" 
CREATE (P)-[r:is_connected_with]->(P) RETURN r
会有用的,看起来好多了

MATCH (p1:Name),(p2:Name) 
WHERE p1.id = "1" AND p2.id = "2" 
CREATE (p1)-[r:IS_CONNECTED_WITH]->(p2) RETURN r
但是,您的查询不起作用的原因是,通过编写匹配的p:names,p:names,其中p.id=1和p.id=2,实际上是说查找一个节点,将其称为“p”,id为1和2。这不是你想要的,而且显然是行不通的

如果要创建多个节点,则需要为要创建的每对节点重新运行此查询,每次更改分配的ID。您也可以在一个查询中创建节点及其关系:

CREATE (p1:Name {id:"1"})-[r:IS_CONNECTED_WITH]->(p2:Name {id:"2"}) RETURN r
在应用程序中,只需在运行查询之前更改要分配给节点的ID。标识符是实例变量,它们在查询完成时消失

编辑1

还有一件事,在应用程序中设置id属性并将其分配给数据库,而不是依赖Neo4j创建的内部id是一种最佳做法。我建议避免使用顺序ID,而是使用一些东西来创建一个唯一的ID。在Ruby中,许多人使用SecureRandom::uuid来实现这一点,我相信在您使用的任何语言中都有类似的方法

编辑2


Neo4j支持整数属性。{id:1}!={id:1}。如果您的字段应该是整数,请使用整数。

@wassgren对如何修复您的查询有正确的答案,但我可能能够详细说明原因,并且在注释中留下的时间太长

在描述节点或关系时,冒号前面的字符称为标识符,它只是表示密码查询中的节点/rel的变量。Neo4j有一些您没有遵循的命名约定,因此,它使您的查询更难阅读,并且将来也更难获得帮助。最佳做法包括:

标识符以小写字母开头:person而不是Person1,p而不是p 标签是单数的,其第一个字符大写:p1:Name,而不是p1:Name或p1:Name或p1:Name 关系都是大写的,[r:IS\u CONNECTED\u WITH],而不是[r:IS\u CONNECTED\u WITH],尽管这一个一直被打破;- 回到您的查询,它既不起作用,也不符合惯例

不起作用:

MATCH (P:names),(P:names) 
WHERE P.id = "1" AND P.id = "2" 
CREATE (P)-[r:is_connected_with]->(P) RETURN r
会有用的,看起来好多了

MATCH (p1:Name),(p2:Name) 
WHERE p1.id = "1" AND p2.id = "2" 
CREATE (p1)-[r:IS_CONNECTED_WITH]->(p2) RETURN r
但是,您的查询不起作用的原因是,通过编写匹配的p:names,p:names,其中p.id=1和p.id=2,实际上是说查找一个节点,将其称为“p”,id为1和2。这不是你想要的,而且显然是行不通的

如果要创建多个节点,则需要为要创建的每对节点重新运行此查询,每次更改分配的ID。您可以创建节点 也可以在一个查询中查询它们之间的关系:

CREATE (p1:Name {id:"1"})-[r:IS_CONNECTED_WITH]->(p2:Name {id:"2"}) RETURN r
在应用程序中,只需在运行查询之前更改要分配给节点的ID。标识符是实例变量,它们在查询完成时消失

编辑1

还有一件事,在应用程序中设置id属性并将其分配给数据库,而不是依赖Neo4j创建的内部id是一种最佳做法。我建议避免使用顺序ID,而是使用一些东西来创建一个唯一的ID。在Ruby中,许多人使用SecureRandom::uuid来实现这一点,我相信在您使用的任何语言中都有类似的方法

编辑2


Neo4j支持整数属性。{id:1}!={id:1}。如果您的字段应该是整数,请使用整数。

是,这有效。当两个节点的名称相同(例如,p而不是p1和p2)时,似乎不起作用。但是,Pseudo不是节点的真实名称-它是您在特定查询中给出的名称。很抱歉,我问题中的命名令人困惑。我编辑了它。所以我不应该为我的节点使用相同的名称,即使有一个使它们唯一的id?当我必须生成数千个节点时,这可能非常棘手。是的,如果您在同一个查询中创建它们。@dkar-我添加了一个要点,您可以检查您是否喜欢。看一看,了解一些基本知识。是的,这很有效。当两个节点的名称相同(例如,p而不是p1和p2)时,似乎不起作用。但是,Pseudo不是节点的真实名称-它是您在特定查询中给出的名称。很抱歉,我问题中的命名令人困惑。我编辑了它。所以我不应该为我的节点使用相同的名称,即使有一个使它们唯一的id?当我必须生成数千个节点时,这可能非常棘手。是的,如果您在同一个查询中创建它们。@dkar-我添加了一个要点,您可以检查您是否喜欢。看一看,了解一些基本知识。谢谢你的宝贵意见。特别是最后一句话。我不清楚标识符是否会在之后消失。谢谢你非常有用的评论。特别是最后一句话。我不清楚标识符是否会在之后消失。