Neo4j/Cypher:通过WITH传递属性
Neo4j/Cypher: Passing properties through WITH
我发布了一个新问题,因为这是一个单独但与此问题相关的问题:
以下查询返回正确的节点数。
MATCH (act)--(obj)
WHERE obj.filename IN ["6013", "6005"]
WITH act.timestamp as timestamp, collect(DISTINCT act) as acts
CREATE (a:Abs{name: 'SigEvent'})
FOREACH (act in acts | CREATE (act)-[:LINK]->(a))
以下查询忽略 COLLECT 并为集合中的每个条目创建一个 a
节点,而不是为每一对创建一个 a
节点。此外,当我将 CREATE
移到 FOREACH
之外时,出现以下错误:Type mismatch: expected Any, Map, Node or Relationship but was List<Map>
.
MATCH (act)--(obj)
WHERE obj.filename IN ["6013", "6005"]
WITH act.timestamp as timestamp, collect({act:act, obj:obj}) as pairs
CREATE (a:act{ Event: pairs.obj.filename, Description:pairs.act.message, timestamp:timestamp})
FOREACH (pair in pairs | CREATE (pair)-[:LINK]->(a))
示例数据集:
设置 1:(行动:"Event Log",时间戳:3461000)(行动:"Uptime Report",时间戳:3461000)
设置 2:(行动:"Event Log",时间戳:149100)(行动:"Uptime Report",时间戳:149100)
想要的结果:
(a {来源:"Event Log" & "UPtime Report",时间戳:3461000})<-[:LINk]-(act)
(a {来源:"Event Log" & "UPtime Report",时间戳:149100)<-[:LINk]-(act)
当您使用 COLLECT(或任何聚合)时,WITH/RETURN 中的所有其他非聚合将用作 GROUP BY 键。因此,通过添加 act 和 obj,COLLECT 正在收集具有相同时间戳、act 和 obj 的所有 act(又名,每个 act 1 act)。如果需要聚合多列,可以同时聚合多个columns/properties
MATCH (act)--(obj)
WHERE obj.filename IN ["6013", "6005"]
WITH act.timestamp as timestamp, COLLECT(DISTINCT act.message) as messages, COLLECT(DISTINCT obt.filename) as filenames, COLLECT(act) as acts
CREATE (a{ Event: filenames, Description:messages, timestamp:timestamp})
FOREACH (act in acts | CREATE (act)-[:LINK]->(a))
我发布了一个新问题,因为这是一个单独但与此问题相关的问题:
以下查询返回正确的节点数。
MATCH (act)--(obj)
WHERE obj.filename IN ["6013", "6005"]
WITH act.timestamp as timestamp, collect(DISTINCT act) as acts
CREATE (a:Abs{name: 'SigEvent'})
FOREACH (act in acts | CREATE (act)-[:LINK]->(a))
以下查询忽略 COLLECT 并为集合中的每个条目创建一个 a
节点,而不是为每一对创建一个 a
节点。此外,当我将 CREATE
移到 FOREACH
之外时,出现以下错误:Type mismatch: expected Any, Map, Node or Relationship but was List<Map>
.
MATCH (act)--(obj)
WHERE obj.filename IN ["6013", "6005"]
WITH act.timestamp as timestamp, collect({act:act, obj:obj}) as pairs
CREATE (a:act{ Event: pairs.obj.filename, Description:pairs.act.message, timestamp:timestamp})
FOREACH (pair in pairs | CREATE (pair)-[:LINK]->(a))
示例数据集:
设置 1:(行动:"Event Log",时间戳:3461000)(行动:"Uptime Report",时间戳:3461000)
设置 2:(行动:"Event Log",时间戳:149100)(行动:"Uptime Report",时间戳:149100)
想要的结果:
(a {来源:"Event Log" & "UPtime Report",时间戳:3461000})<-[:LINk]-(act)
(a {来源:"Event Log" & "UPtime Report",时间戳:149100)<-[:LINk]-(act)
当您使用 COLLECT(或任何聚合)时,WITH/RETURN 中的所有其他非聚合将用作 GROUP BY 键。因此,通过添加 act 和 obj,COLLECT 正在收集具有相同时间戳、act 和 obj 的所有 act(又名,每个 act 1 act)。如果需要聚合多列,可以同时聚合多个columns/properties
MATCH (act)--(obj)
WHERE obj.filename IN ["6013", "6005"]
WITH act.timestamp as timestamp, COLLECT(DISTINCT act.message) as messages, COLLECT(DISTINCT obt.filename) as filenames, COLLECT(act) as acts
CREATE (a{ Event: filenames, Description:messages, timestamp:timestamp})
FOREACH (act in acts | CREATE (act)-[:LINK]->(a))