我在JSON文件中有一些数据:
{"title": "Title1", "authors": [{"name": "John Mulaney", "org": "Stanford"}, {"name": "Dave Chappelle", "org": "MIT"}, {"name": "Kurt Warner", "org": "UCSB"}, {"name": "Hulk Hogan", "org": "UCSD"}], "id": "abc123"}
{"title": "Title2", "authors": [{"name": "Rick Sanchez", "org": "MIT"}, {"name": "Amy Schumer", "org": "Harvard"}], "id": "xyz234"}
具体来说,我想向作者和论文之间的每个关系添加一个属性,该属性与作者列表中作者的位置相对应-该属性看起来像
"position":"first_author", "position":"second_author", etc and the last author is "position":"last_author".
每篇论文的作者数量都是可变的。
以下Cypher命令为论文和作者创建节点,并在它们之间创建关系。
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 (p:Paper {id:q.id}) ON CREATE SET p.title=q.title
CREATE (a)-[:AUTHORED]->(p)
当作者数量可变时,如何跟踪作者列表中的位置并将其添加为关系的属性?
非常感谢您的帮助!
答案 0 :(得分:1)
首先,为了优化您的查询,我更喜欢将MERGE
的{{1}}放在Paper
的循环之外:
Author
要回答您的问题,您需要创建作者职位的索引。为此,我将使用:CALL apoc.load.json('file.txt') YIELD value AS q
UNWIND q.id AS id
MERGE (p:Paper {id:q.id}) ON CREATE SET p.title=q.title
WITH p, q
UNWIND q.authors as authors
MERGE (a:Author {name:authors.name})
CREATE (a)-[:AUTHORED]->(p)
。
例如,range(0, size(q.authors), 1) AS index
为此RETURN range(0, 10, 1) AS index
最后,这是搜索到的查询:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]