密码在每个列表列表中的所有元素之间创建关系

时间:2018-12-03 22:51:12

标签: neo4j cypher

我在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

有关如何执行此操作的建议? 任何帮助将不胜感激!

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)