所以我有这样的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
的语句,但是我不确定为什么。任何建议,我们将不胜感激!
答案 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。