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

时间:2015-01-13 14:15:39

标签: neo4j

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

我试图为我的雇主评估Neo4j。我没有参与设置eval环境,它看起来很小。我只有基于网络的浏览器& cypher完成任何事情。我甚至无法将文件加载到服务器以便通过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语句。

非常感谢你的想法!

1 个答案:

答案 0 :(得分:6)

要格式化查询,请检查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语句而不需要单独的查询,就像您可以执行相同的操作来执行多个匹配一样。