Neo4j当Key是可选的时,如何从JSON数据中合并节点

时间:2018-07-13 14:30:09

标签: json neo4j cypher

所以我有这样的JSON数据:

{"title": "Title1", "authors": [{"name": "Dave Chappelle", "org": "MIT"}], "id": "abc123"}
{"title": "Title2", "authors": [{"name": "Rick Sanchez"}, {"name": "Amy Schumer"], "id": "xyz234"}

org键仅出现在某些论文的作者列表中。

如果存在,我想检查该组织是否已经有一个节点。如果组织节点已经存在,那么我只想创建关系(如果该关系尚不存在)。如果组织节点不存在,那么我想创建一个节点(o:Organization {name:authors.org}),并在该作者和组织之间创建关系WORKS_AT(如果该关系尚不存在)。

我当前正在尝试的查询:

CALL apoc.load.json('file.txt') YIELD value AS q UNWIND q.id AS id UNWIND q.authors as authors 
MERGE (a:Author {name:authors.name}) 
MERGE (o:Organization {name:authors.org}) WHERE authors.org IS NOT NULL 
MERGE (i:Paper {id:q.id}) ON CREATE SET i.title=q.title
MERGE (a)-[:WORKS_AT]->(o) 
RETURN o.name;

但是,这给了我一个错误:

Invalid input 'H': expected 'i/I' (line 2, column 109 (offset: 256))

我认为Cypher希望使用WITH而不是WHERE的语句,但是我不确定为什么。任何建议,我们将不胜感激!

1 个答案:

答案 0 :(得分:2)

您只需要移动条件所在的位置并像这样添加WITH

CALL apoc.load.json('file.txt') YIELD value AS q UNWIND q.id AS id UNWIND q.authors as authors MERGE (a:Author {name:authors.name}) WITH a, q, authors WHERE authors.org is not null MERGE (o:Organization {name:authors.org}) MERGE (i:Paper {id:q.id}) ON CREATE SET i.title=q.title MERGE (a)-[:WORKS_AT]->(o) RETURN o.name;

出现错误的原因是您试图在WHERE之后执行MERGE,这在语法上是无效的。在cypher中编写查询结构的方式如下:(取自cypher refcard

[MATCH WHERE] [OPTIONAL MATCH WHERE] [WITH [ORDER BY] [SKIP] [LIMIT]] (CREATE [UNIQUE] | MERGE)* [SET|DELETE|REMOVE|FOREACH]* [RETURN [ORDER BY] [SKIP] [LIMIT]]

在WHERE之后,必须先使用WITH才能使用MERGE。