apoc.periodic.iterate无效

时间:2018-03-27 09:55:10

标签: neo4j cypher

我需要创建一个List,然后添加一个包含大量数据的关系。所以我尝试使用apoc.periodic.iterate,如下所示:

CREATE (pl:List {id: 'some-random-id-01', title:'title-01'})

 WITH pl as pl

 CALL apoc.periodic.iterate('
    MATCH (p:DbLists)
       WHERE p.name CONTAINS "name"
    RETURN p.id as Ids
    SKIP 0 LIMIT 10000
 ', '
   WITH {pl} as pl
     UNWIND Ids as Id
       MATCH (p:DbInfos {id: Id})
         WITH p as cn
          SET cn :Contacts
           WITH cn as cn
           MERGE (pl)-[cnpt:CONTACTS_LISTING  { email: cn.email } ]->(cn)
        RETURN pl
      ', 
      { batchSize:100, parallel:true, pl:pl } 
    ) YIELD batches

    return pl, batches

在上面的查询中,首先我创建了一个List,然后从10000中找到DbLists数据,其中DbLists.name CONTAINS "name-01"返回 {{1 }}。现在id使用CREATE的{​​{1}}与DbInfos建立了关系。

最后返回id

对于DbLists,我的输出值为pl, batchespl。但是当我浏览我的数据库时,我只找到了100个数据,但没有找到任何其他数据,如batches等。

示例数据:

DbLists ::

List

DbInfos ::

Contacts, CONTACTS_LISTING(relationship)

期望的结果::

[{
   id: 'some-id-01',
   name: 'some name 01',
   email: 'email1@gmail.com'
}, {
   id: 'some-id-02',
   name: 'some name 02',
   email: 'email2@gmail.com'
},{ 
    id: 'some-id-03',
   name: 'some name 03',
   email: 'email3@gmail.com'
},{
    id: 'some-id-04',
   name: 'some namex 04',
   email: 'email4@gmail.com'
},
......................
.........................
]

下面:

[
 {
   id: 'list-id-01',
   name: 'some name 01',
   email: 'email1@gmail.com'
  }, {
   id: 'list-id-02',
   name: 'some name 02',
   email: 'email2@gmail.com'
},{ 
   id: 'list-id-03',
   name: 'some name 03',
   email: 'email3@gmail.com'
},{
   id: 'list-id-04',
   name: 'some name 04',
   email: 'email4@gmail.com'
}
]

此处 List { {id: 'some-random-id-01', title:'title-01'} } / \ / \ C_L {eml1} C_L {eml2} / \ DbInfos::Contacts DbInfos::Contacts {} { id: 'list-id-01', { id: 'list-id-02', email: 'email1@gmail.com' email: 'email2@gmail.com'} } .................................... .................................... C_L = CONTACTS_LISTING eml1 = 'email1@gmail.com' eml2 = 'email2@gmail.com' 具有相同的标签。

有什么建议吗?

先谢谢。

2 个答案:

答案 0 :(得分:0)

我看到可能出现的问题,即你没有传递下面的变量pl,并且在不确定cn.email属性存在的情况下创建关系:

...
WITH cn as cn
MERGE (pl)-[cnpt:CONTACTS_LISTING  { email: cn.email } ]->(cn)
...

尝试将内部语句更改为:

WITH {pl} as pl
  UNWIND {Ids} as Id
    MATCH (cn:DbInfos {id: Id}) SET cn :Contacts
    MERGE (pl)-[cnpt:CONTACTS_LISTING]->(cn) SET cnpt.email = cn.email     
RETURN pl

答案 1 :(得分:0)

首先,UNWIND Ids as Id MATCH (p:DbInfos {id: Id})不正确,因为您在DbInfo和DbLists中有绝对不同的ID。因此,您永远不会在p:DbInfos中找到{id:Id}的节点。

我已更正您的查询并对其进行了测试。所以这必须奏效。

  1. 创建列表 CREATE (pl:List {id: 'some-random-id-01', title:'title-01'})
  2. 做下一个:
  3. CALL apoc.periodic.iterate(' MATCH (p:DbLists) WHERE p.name CONTAINS "name" RETURN collect(p.id) as Ids SKIP 0 LIMIT 10000 ', ' MATCH (pl:List {id: \'some-random-id-01\', title:\'title-01\'}) WITH pl as pl UNWIND {Ids} as Id MATCH (p:DbInfos {id: Id}) SET p:Contacts WITH p,pl MERGE (pl)-[cnpt:CONTACTS_LISTING { email: p.email } ]->(p) RETURN pl ', { batchSize:100, parallel:true} ) YIELD batches MATCH p=()-[r:CONTACTS_LISTING]->() RETURN p

    如果您有任何问题,欢迎您!