对同一节点类型在导入上使用多个with和Where子句

时间:2020-07-24 17:06:35

标签: neo4j cypher neo4j-apoc

是否有一种使用多个where子句的方法,如下所示?目前,它将运行并处理第一个 WITH 之后的第一组 MERGE 子句,但运行和处理其他之后的第二和第三组 MERGE WITH 子句不运行。我认为是因为第一个 WITH 子句具有以下 WHERE NOT 子句,该子句过滤掉第二个和第三个 WITH 子句的要求? 有人知道一种在一个语句中仍然可以全部运行的方法吗?我正在通过Kettle运行此程序,出于我的目的,它必须在单个语句中。

LOAD CSV WITH HEADERS FROM 'file:///detail.csv' AS row
MERGE   (gpath:GranPath {circPathInstID:row.CircPathInstID})
    ON CREATE SET
        gpath.circPathHumID = row.CircPathHumID,
        gpath.category = row.Type,
    ON MATCH SET
        gpath.circPathHumID = row.CircPathHumID,
        gpath.category = row.Type,
WITH row, gpath
WHERE NOT gpath.category IN ['ETHERNET','PRI TRUNKS','CUSTOMER SIP TRUNKS','ETHERNET TRANSPORT', 'EPON ETHERNET TRANSPORT']
MERGE   (upath:UnmNonEthPath {name:row.CircPathHumID, status:row.CurrentPending})
MERGE   (upath)-[:DATA_SOURCE {source:"GRANITE"}]->(gpath)
WITH row, gpath
WHERE gpath.category IN ['ETHERNET','PRI TRUNKS','CUSTOMER SIP TRUNKS']
MERGE   (usvc:UnmService {name:row.CircPathHumID, status:row.CurrentPending})
MERGE   (usvc)-[:DATA_SOURCE {source:"GRANITE"}]->(gpath)
WITH row, gpath
WHERE gpath.category IN ['ETHERNET TRANSPORT', 'EPON ETHERNET TRANSPORT']
MERGE   (uxp:UnmTransport {name:row.CircPathHumID, status:row.CurrentPending})
MERGE   (uxp)-[:DATA_SOURCE {source:"GRANITE"}]->(gpath)

1 个答案:

答案 0 :(得分:0)

如果第三个WITH子句之前的所有内容均按预期工作,那么它必须是失败的第三个WHERE子句之后 WITH子句。

实际上,由于您的第二个WHERE子句是这个(请注意NOT):

WHERE NOT gpath.category IN [
  'ETHERNET','PRI TRUNKS','CUSTOMER SIP TRUNKS',
  'ETHERNET TRANSPORT','EPON ETHERNET TRANSPORT']

您的第三个是这个

WHERE gpath.category IN [
  'ETHERNET','PRI TRUNKS','CUSTOMER SIP TRUNKS']

第三个WHERE子句永远不可能成功。

如果您尝试有条件执行操作,则应查看Conditional Cypher Execution的APOC程序。在您的情况下,由于您有3个条件并想写入数据库,因此应考虑使用apoc.do.case

例如:

LOAD CSV WITH HEADERS FROM 'file:///detail.csv' AS row
MERGE (gpath:GranPath {circPathInstID:row.CircPathInstID})
SET
  gpath.circPathHumID = row.CircPathHumID,
  gpath.category = row.Type
WITH row, gpath
CALL apoc.do.case(
  [
    gpath.category IN ['ETHERNET','PRI TRUNKS','CUSTOMER SIP TRUNKS'],
      'MERGE (usvc:UnmService {name:row.CircPathHumID, status:row.CurrentPending})
       MERGE (usvc)-[:DATA_SOURCE {source:"GRANITE"}]->(gpath)',
    gpath.category IN ['ETHERNET TRANSPORT', 'EPON ETHERNET TRANSPORT'],
      'MERGE (uxp:UnmTransport {name:row.CircPathHumID, status:row.CurrentPending})
       MERGE (uxp)-[:DATA_SOURCE {source:"GRANITE"}]->(gpath)'
  ],
  'MERGE (upath:UnmNonEthPath {name:row.CircPathHumID, status:row.CurrentPending})
   MERGE (upath)-[:DATA_SOURCE {source:"GRANITE"}]->(gpath)',
  {row: row, gpath: gpath})
YIELD value
RETURN gpath
相关问题