Neo4j中的多个匹配语句

时间:2014-10-01 16:21:39

标签: neo4j

我有一个MATCH语句列表,这些语句彼此完全无关。但如果我像

那样执行它们
MATCH (a:Person),(b:InProceedings) WHERE a.identifier = 'person/joseph-valeri' and b.identifier = 'conference/edm2008/paper/209' CREATE (a)-[r:creator]->(b)
MATCH (a:Person),(b:InProceedings) WHERE a.identifier = 'person/nell-duke' and b.identifier = 'conference/edm2008/paper/209' CREATE (a)-[r:creator]->(b)

但如果我立即执行它们,我会收到以下错误:

WITH is required between CREATE and MATCH (line 2, column 1)

我应该加入哪些更改? (我是Neo4j的新手)

1 个答案:

答案 0 :(得分:1)

这是否需要在单个交易中进行?在这种情况下,您应该在执行create之前预先匹配节点:

MATCH (jo:Person{identifier:'person/joseph-valeri'}), (nell:Person{identifier:'person/nell-duke'}), (b:InProceedings{identifier:'conference/edm2008/paper/209'}) 
CREATE (jo)-[:creator]->(b), (nell)-[:creator]->(b)

如果它只是两个创作者,您可以将创建更改为:

CREATE (jo)-[:creator]->(b)<-[:creator]-(nell)

如果这不是您想要实现的目标,那么您发布的有效内容就是两个不同的Cypher语句,您尝试将其作为一个语句运行,并且解析器会变得混乱。

发表评论编辑

鉴于您说了数百万,我认为您将在执行导入禁止时找到交易时间,因此如果可以,您应该调查CSV import syntax(并特别注意PERIODIC COMMIT)写入CSV而不是写入大型Cypher转储?

如果出于某种原因,这不是一个选项而你是从空开始然后慢慢构建 - 首先创建节点。这些将需要名称以保持加速(但这些名称不会持续存在,只在Cypher查询中保持不变):

CREATE (a:Person{identifier:'person/joseph-valeri'}), 
(b:Person{identifier:'person/nell-duke'}), 
(zzz:Person{identifier:'person/do-you-really-want-person-in-all-these-identifiers'}),
(inProca:InProceedings{identifier:'conference/edm2008/paper/209'}),
(inProcb:InProceedings{identifier:'conference/edm2009/paper/209'})

您将在Python脚本中跟踪a,b .. zzz,允许您使用以下内容构建CREATE语句:

(a)-[:creator]->(inProcA), (zzz)-[:creator]-(inProcB)

现在,如果您的所有节点都已存在,而您现在只想构建关系,那么您可以选择:

  1. 为每个新关系执行单独的MATCHCREATE s,每个关系单独排除它们。这看起来就像您的原始代码所做的那样。您应该将条件移到MATCH而不是WHERE子句。
  2. MATCH大量节点和CREATE新的关系。这更类似于我的初始代码所做的事情,并且要求您的脚本在生成查询时要聪明。
  3. MERGE将现有节点转换为新关系。
  4. 无论你做什么,你都需要在交易中批量处理,或者你的内存耗尽 - 你可以建议Neo4J使用USING PERIODIC COMMIT 50000来做到这一点语法,这里有一个很棒的blog post

相关问题