我需要创建一个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, batches
和pl
。但是当我浏览我的数据库时,我只找到了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'
具有相同的标签。
有什么建议吗?
先谢谢。
答案 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}的节点。
我已更正您的查询并对其进行了测试。所以这必须奏效。
CREATE (pl:List {id: 'some-random-id-01', title:'title-01'})
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
如果您有任何问题,欢迎您!