Neo4j / Cypher:通过WITH

时间:2018-10-16 19:30:36

标签: neo4j cypher neo4j-apoc cypher-3.1

我要发布一个新问题,因为这是与此问题相关的独立问题:Neo4j: Link Different Nodes to the one node

以下查询返回正确数量的节点。

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 :(操作:“事件日志”,时间戳:3461000)(操作:“正常运行时间报告”,时间戳:3461000)

设置2 :(操作:“事件日志”,时间戳:149100)(操作:“正常运行时间报告”,时间戳:149100)

所需结果:

(a {来源:“事件日志”和“ UPtime报告”,时间戳:3461000})<-[:LINk]-(动作)

(a {来源:“事件日志”和“ UPtime报告”,时间戳:149100)<-[:LINk]-(动作)

1 个答案:

答案 0 :(得分:1)

使用COLLECT(或任何集合)时,WITH / RETURN中的所有其他非集合将用作GROUP BY键。因此,通过添加act和obj,COLLECT收集具有相同时间戳,act和obj(又称每个act 1个act)的所有act。如果您需要汇总多个列,则可以同时汇总多个列/属性

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))