使用Cypher创建与现有节点的多个关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Cypher创建与现有节点的多个关系相关的知识,希望对你有一定的参考价值。

如果以前曾问过这个问题我很抱歉。它似乎比应该更基本。

我正在为我的雇主评估Neo4j。我没有参与设置eval环境,它看起来很小。我只有基于网络的浏览器和密码才能完成任何工作。我甚至无法将文件加载到服务器以便通过CSV加载。

我在加载测试数据时遇到了很多麻烦。我选择使用数据仓库元数据作为我的主题并添加:表节点然后:模型节点(对表[APPEAR_ON]的图表进行编目)。我应该指出...... APPEAR_ON关系源自RDMS中的多对多关系:模型包含许多表;表格可以出现在多个模型上。所以我认为我不能在节点的同时加载关系。除了加载所有节点然后加载所有关系,我不知道还有什么可以尝试。评论?

  • 我可以通过将多个CREATE / MERGE语句放在不同的行上并将它们粘贴到浏览器中的cypher查询工具中来加载:表节点和:模型节点。
  • 在创建节点后,我还为这些标签创建了索引/唯一性约束。 (我为每个加载了ID属性。)
  • 但是我不知道如何使用多语句方法创建关系。 MATCH (t:table),(m:model) WHERE t.tid = "T0525" AND m.mid = "M001" CREATE (t)-[R00864:APPEARS_IN]->(m) MATCH (t:table),(m:model) WHERE t.tid = "T0526" AND m.mid = "M001" CREATE (t)-[R00865:APPEARS_IN]->(m)

不幸的是,我只能通过在语句末尾包含RETURN来一次完成这项工作。当我发送多个语句时,我收到一个错误,说我需要在第一个语句的CREATE和第二个语句的MATCH之间包含一个WITH语句。

非常感谢您的想法!

答案

要格式化查询,请选中cypher refcard的右上方框。你的查询大多是正确的,但我想你做的太多了。如果没有with,你不能做这样的多个匹配/创建块。

因此,重写此方法的一种方法是将其作为两个查询:

MATCH (t:table),(m:model) WHERE t.tid = "T0525" AND m.mid = "M001" CREATE (t)-[R00864:APPEARS_IN]->(m);

MATCH (t:table),(m:model) WHERE t.tid = "T0526" AND m.mid = "M001" CREATE (t)-[R00865:APPEARS_IN]->(m);

但是你要两次“重新匹配”同一个模型。所以你也可以这样做:

MATCH  (t1:table { tid: "T0525" }), 
       (m:model {mid: "M001"}), 
       (t2:table { tid: "T0526 })
CREATE (t1)-[R00864:APPEARS_IN]->(m),
       (t2)-[R00865:APPEARS_IN]->(m);

请注意,我通过在匹配属性中添加匹配条件来消除WHERE,然后我使用逗号创建两个单独的CREATE语句而没有单独的查询,就像您可以执行相同的操作来执行多个匹配一样。

以上是关于使用Cypher创建与现有节点的多个关系的主要内容,如果未能解决你的问题,请参考以下文章

使用cypher返回多个关系权重

使用 Cypher 向现有节点添加标签

使用 Cypher 在 Neo4j 中通过模式移动与其他节点的关系

CYPHER存储count() - 进一步使用的值

根据 Cypher neo4j 中的属性值总和创建新关系?

CALL apoc.cypher.doIt创建动态节点的时候怎么指定多个标签?