如何有选择地调用这个 APOC 过程? (仅在节点的子集上)
How can I call this APOC procedure selectively? (only on a subset of nodes)
我有一个 Neo4J 数据库,其中包含许多标签为 com 的节点。这些节点包含一个键 属性 - 它以我想要的方式对它们进行唯一分组。它们还有一个时间戳 属性,以及许多其他整数属性。
这是我面临的问题:我想使用 APOC 图分组过程根据这些节点的关键属性将这些节点聚合在一起。但是,我想有选择地这样做——这样我只聚合节点,如果他们的时间戳属性满足提供的时间window。
我已尝试使用基于时间戳的 WHERE 子句匹配和过滤节点,但我无法专门将这些节点传递给 nodes.group
过程。基本上,我需要弄清楚如何仅在特定的节点子集上调用 nodes.group
。如果有任何帮助,我将不胜感激。
这是我正在执行的呼叫:
CALL apoc.nodes.group(['com'], ['key'], [{val1: 'sum', val2: 'sum', val3: 'sum',' time_start: 'collect'}]) YIELD node
正如我上面提到的,我尝试执行
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)
假设我有一个假设 window 可以使用,即 30 to 70
,我只能找到与我的 window 谓词匹配的节点:
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(*)
是必要的,而不是 return 每个临时节点一行。
现在,使用这个逻辑,我们可以:
MATCH
个节点使用 window 谓词
- 为他们分配一个新的
temporary
标签
- 改为在
temporary
标签上使用 apoc.nodes.group
- 删除
temporary
标签
- Return分组节点
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"} │
└────────────────────────┘
我有一个 Neo4J 数据库,其中包含许多标签为 com 的节点。这些节点包含一个键 属性 - 它以我想要的方式对它们进行唯一分组。它们还有一个时间戳 属性,以及许多其他整数属性。
这是我面临的问题:我想使用 APOC 图分组过程根据这些节点的关键属性将这些节点聚合在一起。但是,我想有选择地这样做——这样我只聚合节点,如果他们的时间戳属性满足提供的时间window。
我已尝试使用基于时间戳的 WHERE 子句匹配和过滤节点,但我无法专门将这些节点传递给 nodes.group
过程。基本上,我需要弄清楚如何仅在特定的节点子集上调用 nodes.group
。如果有任何帮助,我将不胜感激。
这是我正在执行的呼叫:
CALL apoc.nodes.group(['com'], ['key'], [{val1: 'sum', val2: 'sum', val3: 'sum',' time_start: 'collect'}]) YIELD node
正如我上面提到的,我尝试执行
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)
假设我有一个假设 window 可以使用,即 30 to 70
,我只能找到与我的 window 谓词匹配的节点:
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(*)
是必要的,而不是 return 每个临时节点一行。
现在,使用这个逻辑,我们可以:
MATCH
个节点使用 window 谓词- 为他们分配一个新的
temporary
标签 - 改为在
temporary
标签上使用apoc.nodes.group
- 删除
temporary
标签 - Return分组节点
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"} │
└────────────────────────┘