Cypher создает отношения между всеми элементами в каждом списке списков - PullRequest
0 голосов
/ 04 декабря 2018

У меня большой список небольших списков в файле 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 голосов
/ 04 декабря 2018

Ваша попытка фактически создает: отношения CO_CREATOR с новыми пустыми узлами, вы можете сначала удалить пустые узлы и их отношения.

Следует иметь в виду, что если вы хотите создать: Projectузлы из ваших исходных данных вместе с теми, кто участвовал в создании проекта, у вас будет возможность запросить через эти узлы, чтобы найти соавторов и силу этих коллабораций.

Итак, если вы объединены в: Projectsа также отношения: 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

А вот запрос импорта, который вы бы использовали для объединения проектов и присоединения их к вашемууже импортировано: узлы авторов:

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)

EDIT

Если вы хотите использовать эту существующую структуру для создания: 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...