Игнорирование свойства в Cypher Query ИЛИ альтернатива: как считать последовательности отношений - PullRequest
0 голосов
/ 04 января 2019

следующие операторы Cypher дают мне вывод графика (см. Изображение) под кодом. А также вывод текста под изображением. Моя проблема - вывод текста.

Я попытаюсь четко объяснить проблему: меня интересуют одинаковые последовательности двух узлов в отношении определенного свойства (здесь: personName). Например. как вы можете видеть на картинке (или из оператора create), Боб приходит после мая дважды. Я хотел захватить это через apoc.coll.frequencies (pairOfActs), как GiveBackFrequencyOfPairs ВОЗВРАТИТЬ giveBackFrequencyOfPairs. Тем не менее, свойство «время» находится в пути. Есть ли способ игнорировать свойство времени? Я пытался с операциями над списками, а также с удалением свойства времени (тогда моя последовательность исчезла), но ничего не работает. Какие-либо предложения? Или этот подход полностью неверен, или есть даже предопределенная функция для подсчета определенных последовательностей узлов, которые мне не хватает?

CREATE
    (a: Action {personName: 'Tom', time: 1}), 
    (b: Action {personName: 'May', time: 2}),  
    (c: Action {personName: 'Bob', time: 3}),
    (d: Action {personName: 'Alex', time: 4}), 
    (e: Action {personName: 'Zac', time: 5}),
    (f: Action {personName: 'Jill', time: 6}),
    (g: Action {personName: 'May', time: 7}),  
    (h: Action {personName: 'Bob', time: 8})


MATCH (act: Action) 
WITH act  ORDER BY act.time ASC 
WITH COLLECT(act) AS acts 
FOREACH (n IN RANGE(0, size(acts)-2) |
FOREACH (curr IN [acts[n]] | 
FOREACH (next IN [acts[n+1]] | 
MERGE (curr)-[:NEXT]-> (next)))) 
WITH apoc.coll.pairsMin(acts) as pairsOfActs
UNWIND pairsOfActs as unwoundPairsOfActs
WITH apoc.coll.frequencies(unwoundPairsOfActs) AS    giveBackFrequencyOfPairs
RETURN giveBackFrequencyOfPairs

enter image description here enter image description here

1 Ответ

0 голосов
/ 04 января 2019

Для указанной проблемы нет необходимости создавать отношения NEXT, поэтому этот ответ не мешает их создавать.Вы можете изменить этот ответ, чтобы добавить его обратно, если это действительно необходимо по какой-то причине.

Этот запрос должен возвращать частоту каждой пары имен (которые появляются в вашей последовательности time):

MATCH (act: Action) 
WITH act ORDER BY act.time ASC 
RETURN apoc.coll.frequencies(apoc.coll.pairsMin(COLLECT(act.personName))) AS giveBackFrequencyOfPairs

Вывод с вашими примерами данных будет:

╒══════════════════════════════════════════════════════════════════════╕
│"giveBackFrequencyOfPairs"                                            │
╞══════════════════════════════════════════════════════════════════════╡
│[{"count":1,"item":["Tom","May"]},{"count":2,"item":["May","Bob"]},{"c│
│ount":1,"item":["Bob","Alex"]},{"count":1,"item":["Alex","Zac"]},{"cou│
│nt":1,"item":["Zac","Jill"]},{"count":1,"item":["Jill","May"]}]       │
└──────────────────────────────────────────────────────────────────────┘
...