CYPHER storing count () - значение для дальнейшего использования - PullRequest
0 голосов
/ 30 мая 2018

Я хочу создать отношение между узлами, которые имеют одну или несколько общих вещей, и хочу установить количество общих вещей как свойство внутри отношения.

Например: в учебнике по фильмам-граф Я хочу создать отношения между актерами, которые действовали в одном и том же фильме вместе, и заданным количеством фильмов, в которых они играли вместе, как свойство в отношениях.

Для основного подсчета,Учебное пособие предоставляет запрос:

MATCH (n)-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors)
RETURN n.name, coActors.name, count(*) AS Strength ORDER BY Strength DESC

Это дает мне список из 2 имен и количества раз, когда они играли в фильмах вместе (например, "Киану Ривз", "Кэрри-Энн Мосс", Сила: 3-> поскольку в графике 3 фильма «Матрица».)

Теперь я хочу создать связь (ACTED_WITH) между этими парами и установить значение силы в качестве свойства внутри него.Я могу создать отношение, подобное этому:

MATCH (a)-[:ACTED_IN]->(p)<-[:ACTED_IN]-(b) MERGE (a)-[r:ACTED_WITH]->(b)

MERGE гарантирует, что создана только одна связь, но я просто не могу заставить подсчетные вещи работать с созданием.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вы можете использовать SET Cypher предложение , чтобы установить свойства соответствующего узла.Если вы попытаетесь установить его в предложении MERGE , то слияние будет рассматривать ключ (ы) как уникальный идентификатор и создаст новое отношение, если оно еще не существует с этим конкретным значением.

MATCH (a)-[:ACTED_IN]->(p)<-[:ACTED_IN]-(b)
MERGE (a)-[r:ACTED_WITH]->(b)
// reduce matched set to one row of data
WITH DISTINCT a, b, r, COUNT(p) as strength, COLLECT(p) as movies
// set r
SET r.strength = strength
// Return everything to verify above results
RETURN *

SET перезапишет любое предыдущее значение.Если вы хотите установить его только при создании отношения, вы можете использовать ON CREATE или ON MATCH.

0 голосов
/ 30 мая 2018

Я не уверен, что понимаю, что вы хотите, но может быть что-то вроде этого:

  MATCH (a)-[:ACTED_IN]->(m)<-[:ACTED_IN]-(b) 
   WITH  a,b, collect(m) AS movies ORDER BY size(movies)  DESC
   MERGE (a)-[r:ACTED_WITH]-(b)
   ON CREATE SET r.Strength=SIZE(movies)
...