我在JSON文件中有很多较小的列表。对于大列表中的每个较小列表,我想在较小列表中的所有项目之间创建关系。
在此示例中,我有2个列表的列表,其中每个列表都有3位作者。
{"title": "Project A", "creators": [{"name": "Dave Chappelle"}, {"name": "Brian Griffin", "org": "ABC"}, {"name": "Dave Jones"}]}
{"title": "Project B", "creators": [{"name": "Dave Chappelle"}, {"name": "Brian Griffin"}, {"name": "Bob Dylan", "org": "NBC"}]}
{"title": "Project C", "creators": [{"name": "Rick Sanchez"}, {"name": "Jack Johnson", "org": "NBC"}, {"name": "Ken Burns"}]}
我想为每个作者创建一个节点,我已经使用以下代码完成了该操作:
CALL apoc.load.json('file:/path/to/data.txt')
YIELD value AS q UNWIND q.authors as author
MERGE (a:Authors {name:author.name})
然后,我想在一起从事一个项目的创作者之间建立关系。如果人们多次一起工作,我想在该关系中添加一个属性,以跟踪他们一起工作了多少次。
以下内容似乎在所有创作者之间建立了联系,而不是与刚刚一起从事项目工作的创作者之间建立了联系。
CALL apoc.load.json('file:/path/to/data.txt')
YIELD value AS q UNWIND q.authors as author
MERGE (a:Authors {name:author.name})
MERGE (a)-[c:CO_CREATOR]->()
ON CREATE SET c.strength = 1
ON MATCH SET c.strength += 1
有关如何执行此操作的建议? 任何帮助将不胜感激!
答案 0 :(得分:1)
您的尝试实际上是在创建与新空白节点的:CO_CREATOR关系,您可能要先删除空白节点及其关系。
要记住的一件事是,如果您想与其他共同创建项目的人一起从源数据中创建:Project节点,则可以查询这些节点以找到合作者和优势这些合作。
因此,假设您合并了:Projects以及:Project节点和:Authors节点之间的:CO_CREATOR关系,则可以执行以下操作:
MATCH (a:Authors {name:'Dave Chappelle'})-[:CO_CREATOR*2]-(coAuthor)
WITH coAuthor, count(coAuthor) as strength
ORDER BY strength DESC
RETURN coAuthor, strength
这是导入查询,可用于合并项目并将其附加到已经导入的:Authors节点:
CALL apoc.load.json('file:/path/to/data.txt') YIELD value AS q
MERGE (p:Project {name:q.title})
WITH q, p
UNWIND q.authors as author
MATCH (a:Authors {name:author.name})
MERGE (a)-[:CO_CREATOR]->(p)
编辑
如果要使用此现有结构在作者之间创建:CO_AUTHOR关系,则可以执行以下操作:
MATCH (p:Project)
WHERE size((p)<-[:CO_CREATOR]-()) > 1
WITH [(p)<-[:CO_CREATOR]-(a) | a] as coAuthors
UNWIND apoc.coll.combinations(coAuthors, 2) as pair
WITH pair[0] as first, pair[1] as second
MERGE (first)-[:CO_AUTHOR]-(second)
这假定您已安装APOC程序。如果您不这样做,则可以使用另一种方法来获得2的所有组合,以便可以在它们之间建立关系:
MATCH (p:Project)
WHERE size((p)<-[:CO_CREATOR]-()) > 1
WITH [(p)<-[:CO_CREATOR]-(a) | a] as coAuthors
UNWIND coAuthors as first
UNWIND coAuthors as second
WITH first, second
WHERE id(first) < id(second)
MERGE (first)-[:CO_AUTHOR]-(second)