忽略 Cypher 查询中的 属性 或替代方法:如何计算关系序列
Ignoring a property within Cypher Query OR alternative: how count relationship sequences
以下 Cypher 语句为我提供了代码下方的图形输出(见图)。以及图像下方的文本输出。我的问题是文本输出。
我会尽量把问题解释清楚:我对两个节点的相同序列感兴趣,关于特定的 属性(此处:personName)。例如。正如您在图片中(或从 create 语句中)看到的那样,Bob 在 May 之后出现了两次。我想通过 apoc.coll.frequencies(pairsOfActs) AS giveBackFrequencyOfPairs 捕获这个
RETURN giveBackFrequencyOfPairs。但是,'time' 属性 挡住了路。有没有办法忽略时间属性?我一直在尝试对列表进行操作,还尝试删除时间 属性 (然后我的序列就消失了),但没有任何效果。有什么建议么?或者这种方法完全错误,或者甚至有一个预定义的函数来计算我缺少的特定节点序列?
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
对于您陈述的问题,无需创建 NEXT
关系,因此本答案不会创建它们。如果出于某种原因确实需要,您可以修改此答案以将其添加回去。
此查询应 return 每对名称(出现在您的 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"]}] │
└──────────────────────────────────────────────────────────────────────┘
以下 Cypher 语句为我提供了代码下方的图形输出(见图)。以及图像下方的文本输出。我的问题是文本输出。
我会尽量把问题解释清楚:我对两个节点的相同序列感兴趣,关于特定的 属性(此处:personName)。例如。正如您在图片中(或从 create 语句中)看到的那样,Bob 在 May 之后出现了两次。我想通过 apoc.coll.frequencies(pairsOfActs) AS giveBackFrequencyOfPairs 捕获这个 RETURN giveBackFrequencyOfPairs。但是,'time' 属性 挡住了路。有没有办法忽略时间属性?我一直在尝试对列表进行操作,还尝试删除时间 属性 (然后我的序列就消失了),但没有任何效果。有什么建议么?或者这种方法完全错误,或者甚至有一个预定义的函数来计算我缺少的特定节点序列?
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
对于您陈述的问题,无需创建 NEXT
关系,因此本答案不会创建它们。如果出于某种原因确实需要,您可以修改此答案以将其添加回去。
此查询应 return 每对名称(出现在您的 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"]}] │
└──────────────────────────────────────────────────────────────────────┘