Neo4j:在现有节点之间添加关系时出错

Neo4j: error in adding relationships among existing nodes

在编写查询以将关系添加到现有节点时,它会不断警告我这条消息:

"此查询在断开连接的模式之间构建笛卡尔积。 如果查询的一部分包含多个断开连接的模式,这将在所有这些部分之间构建一个笛卡尔积。这可能会产生大量数据并减慢查询处理速度。虽然偶尔有意,但通常可以重新制定避免使用此叉积的查询,可能是通过在不同部分之间添加关系或使用可选匹配(标识符为:(e))"

如果我 运行 查询,它不会创建关系。 查询是:

match   
    (a{name:"Angela"}),
    (b{name:"Carlo"}),
    (c{name:"Andrea"}),
    (d{name:"Patrizia"}),
    (e{name:"Paolo"}),
    (f{name:"Roberta"}),
    (g{name:"Marco"}),
    (h{name:"Susanna"}),
    (i{name:"Laura"}),
    (l{name:"Giuseppe"})


create  
    (a)-[:mother]->(b),
    (a)-[:grandmother]->(c), (e)-[:grandfather]->(c), (i)-[:grandfather]->(c), (l)-[:grandmother]->(c),
    (b)-[:father]->(c),
    (e)-[:father]->(b),
    (l)-[:father]->(d),
    (i)-[:mother]->(d),
    (d)-[:mother]->(c),
    (c)-[:boyfriend]->(f),
    (g)-[:brother]->(f),
    (g)-[:brother]->(h),
    (f)-[:sister]->(g), (f)-[:sister]->(h)

谁能帮帮我?

PS:如果我 运行 相同的查询,但只有一个或两个关系(匹配子句中的节点较少),它会正确创建关系。

这些 name 个字符串是否都存在?如果不是,那么您将不会得到任何结果,因为这是一场重要的比赛。您可以尝试将其更改为 MERGE.

但是 Supamiu 是对的,你真的应该在 :Person(name) 上有一个标签(比如 Person)和一个索引。

这里有什么问题?

  • 首先,正如我在评论中提到的,你没有任何标签,这是一个非常糟糕的做法,因为标签对于匹配某些数据集中的属性很有用(如果你匹配“ name" 属性,你不想在没有名字的节点上匹配它,这里有标签。

  • 第二个问题是你的查询不知道它会在它之前得到多少个节点。这意味着如果您有 500 000 个具有 name : "Angela" 的节点和 500 000 个具有 name : "Carlo" 的节点,您将从每个 Angela 节点创建一个关系,继续每个 Carlo,这是一个相当大的查询(500 000 *如果我的数学不错的话,可以创建 500 000 个关系)。 Cypher 对此发出了警告。

  • Cypher 仍然会告诉你这个警告,因为你没有使用 Unique 属性来匹配你的节点,即使有标签,你仍然会收到警告。

解决方案?

  • 使用 unique properties 创建和匹配您的节点,从而避免笛卡尔积。

  • 始终使用标签,没有标签的 Neo4j 就像在 SQL 中使用一个巨人 table 来存储所有数据。

如果您想知道您的查询将如何 运行,请在查询前使用 PROFILE,这是您的查询的配置文件计划: