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

3
非常抱歉如果此问题之前已经被问过。它似乎比应该更基础。
我正在尝试为我的雇主评估Neo4j。我没有参与建立评估环境,似乎很简单。我只有基于Web的浏览器和Cypher可用以完成所有工作。我甚至不能加载文件到服务器中以通过CSV进行加载。
而且我在加载测试数据时遇到了很多问题。我选择使用数据仓库元数据作为我的主题,并添加:table节点,然后是:model节点(用于对表[APPEAR_ON]的图表进行编目)。并且我应该指出......APPEAR_ON关系来源于RDMS中的多对多关系:一个模型包含多个表;一个表可以出现在多个模型中。因此,我认为我无法同时加载节点和关系。我不知道还有什么尝试,除了先加载所有节点,然后加载所有关系。你有什么评论吗?
  • 我可以通过将许多CREATE / MERGE语句分别放在不同行中并将它们粘贴到浏览器中的Cypher查询工具中来轻松加载:table节点和:model节点。
  • 我还在创建节点后为这些标签创建了索引/唯一性约束。(我为每个属性(ID)加载了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)
非常感谢您的建议!
1个回答

12

对于格式化查询,请查看Cypher参考卡片右上方的框。你的查询大部分是正确的,但我认为你试图做太多了。这样做不能使用多个match/create块,除非有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);

请注意,我通过将匹配条件作为匹配属性添加并使用逗号创建两个单独的CREATE语句而不是单独的查询来消除了WHERE。你也可以这样做来进行多次匹配。

这很有帮助。我已经能够用一条语句为模型中的所有表创建关系。然而,我无法执行多个语句。我仍然需要逐个运行它们。 - David Brown
我不明白 - 当然你需要逐条执行语句。但问题是什么? - FrobberOfBits
糟糕,我刚收到你的消息。我想要将多个(数百...数千...)语句加载到浏览器中,并一次性点击执行。我不想手动执行每个语句。 - David Brown
我认为浏览器不太适合这个任务。你可能需要使用批量插入工具,或者通过neo4j-shell运行这些语句。我认为你不会在浏览器界面中找到一个简单的方法来完成这个任务,因为它并不是它的设计目的。 - FrobberOfBits
非常感谢。我现在在浏览器页面上看到了一个备用/高级UI按钮。备用UI有一个带控制台的选项卡。我将使用该界面尝试运行此操作。还有其他语法可以推荐吗?例如,使用ForEach的数组?不确定这是否是个好问题。 - David Brown
@DavidBrown 我不建议走那条路。如果你愿意,可以发布一个单独的问题,但我建议使用这个:https://github.com/jexp/batch-import 或者使用neo4j-shell(你可以通过谷歌找到手册)。 - FrobberOfBits

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接