如何解决我如何有选择地调用这个 APOC 程序? 仅在节点的子集上
这是我正在使用的。我有一个带有多个标签 com 节点的 Neo4J 数据库。这些节点包含一个关键属性 - 以我想要的方式对它们进行唯一分组。它们还有一个时间戳属性,以及许多其他整数属性。这是我面临的问题。我想使用 APOC 图分组过程根据它们的关键属性将这些节点聚合在一起。但是,我想有选择地这样做 - 这样我只在节点的时间戳属性满足提供的时间窗口时聚合节点。我曾尝试根据时间戳使用 WHERE 子句匹配和过滤节点,但我无法将这些节点专门传递给 nodes.group 过程。基本上,我需要弄清楚如何仅在特定的节点子集上调用 nodes.group。我很感激任何帮助。
这是我所说的程序: https://neo4j-contrib.github.io/neo4j-apoc-procedures/3.5/virtual/graph-grouping/
这是我正在执行的 CALL: CALL apoc.nodes.group(['com'],['key'],[{val1: 'sum',val2: 'sum',val3: 'sum',' time_start: 'collect'}]) YIELD 节点
正如我上面提到的,我尝试在程序之前执行 MATCH (c:com) WHERE c.time_start >= datetime('2020-12-16T21:45:05Z') 然后链接查询,但它确实不行。该过程仍然在 com 关系的所有节点上被调用,而不仅仅是我过滤的那些。
解决方法
程序本身不允许您通过此类过滤器。然而,有两种可能性可以规避这一点:
- 自己使用 vNode 和 vRelationship 构建虚拟图
- 在节点选择和分组后设置一个临时标签
我将重点放在选项 2 上:
以下图为例:
UNWIND range(1,200) AS i
CREATE (n:com)
SET n.timestamp = i,n.key = apoc.coll.randomItem(items)
假设我有一个假设的窗口可以使用,它是 30 to 70
,我只能找到与我的窗口谓词匹配的节点:
WITH [30,70] AS window
MATCH (n:com)
WHERE n.timestamp > window[0]
AND n.timestamp < window[1]
RETURN count(n)
╒══════════╕
│"count(n)"│
╞══════════╡
│39 │
└──────────┘
在跳转到分组查询之前,我只想展示您可以使用谓词在同一查询中设置标签并删除它。
WITH [30,70] AS window
MATCH (n:com)
WHERE n.timestamp > window[0]
AND n.timestamp < window[1]
SET n:temporary
WITH count(n) AS doSomething
MATCH (n:temporary)
REMOVE n:temporary
WITH count(*) AS break,doSomething
RETURN doSomething
最后一个 WITH count(*)
是不为每个临时节点返回一行所必需的。
现在,使用这个逻辑,我们可以:
-
MATCH
节点使用窗口谓词 - 为他们分配一个新的
temporary
标签 - 改用
apoc.nodes.group
标签上的temporary
- 去除
temporary
标签 - 返回分组的节点
WITH [30,70] AS window
MATCH (n:com) WHERE n.timestamp > window[0] AND n.timestamp < window[1]
SET n:temporary
WITH window,count(*) AS x
CALL apoc.nodes.group(['temporary'],['key'],null,{})
YIELD node,relationship
WITH collect(node) AS elements
MATCH (n:temporary) REMOVE n:temporary
WITH count(*) AS break,elements
UNWIND elements AS element
RETURN element
╒════════════════════════╕
│"element" │
╞════════════════════════╡
│{"count_*":6,"key":"f"} │
├────────────────────────┤
│{"count_*":6,"key":"e"} │
├────────────────────────┤
│{"count_*":12,"key":"d"}│
├────────────────────────┤
│{"count_*":1,"key":"c"} │
├────────────────────────┤
│{"count_*":5,"key":"b"} │
├────────────────────────┤
│{"count_*":9,"key":"a"} │
└────────────────────────┘
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。