我们在 AWS Neptune 中有 370 万个节点和 1120 万个关系。这里我们需要这些节点:Organization
、Member
、和关系
:、Proposal
、、。Vote
Member-[:IN]->Organization
Vote-[:BELONGS_TO]->Proposal
Vote-[:VOTED_BY]->Member
Member-[:IN]->Organization
目标是构建查询,查找组织中的成对成员以及他们投票的提案数量vote.choice
。这是查询:
g.V().has('Organization','id','${id}').as('d').
match(
as('d').in('IN').hasLabel('Vote').as('v1').out('BELONGS_TO').hasLabel('Proposal').as('p'),
as('d').in('IN').hasLabel('Vote').as('v2').out('BELONGS_TO').hasLabel('Proposal').as('p1').
select('p1','p').where('p1',eq('p')
),
as('v1').out('VOTED_BY').hasLabel('Member').as('m1'),
as('v2').out('VOTED_BY').hasLabel('Member').as('m2').
select('v1','v2').by('choice').where('v1',eq('v2'))).
select('m1','m2').by('address').where('m1',lt('m2')).
group().by(
select('m1','m2')).by(select('p').count()
).
order(local).by(values, desc).
limit(local, 20)
问题是查询为具有大量成员和投票的组织返回此错误:
{"code":"MemoryLimitExceededException","detailedMessage":"Query cannot be completed due to memory limitations.","requestId":"e8f8a361-40c4-4db9-8da4-a618d0e20d92"}
可以在 AWS Neptune 上调整内存配置吗?或者应该优化查询以及优化它的方法是什么?
更新:
没有的查询match
:
g.V().has('Dao','organizationId','${id}').as('d').in('IN').hasLabel('Vote').as('v1').out('BELONGS_TO').hasLabel('Proposal').as('p').
select('d').in('IN').hasLabel('Vote').as('v2').out('BELONGS_TO').hasLabel('Proposal').as('p1').where(eq('p')).select('v1').out('VOTED_BY').hasLabel('Member').as('m1').
select('v2').out('VOTED_BY').hasLabel('Member').as('m2').where('v1',eq('v2')).by('choice').
select('m1','m2').by('address').where('m1',lt('m2')).
group().by(
select('m1','m2')
).by(
select('p').count()
).
order(local).by(values, desc).
limit(local,20)
原始密码查询:
CALL {
MATCH (o:Organization { id: '${id}' })<-[:IN]-(p:Proposal)
RETURN COUNT(p) AS total_proposals_count
}
WITH total_proposals_count
MATCH (o:Organization { id: '${id}' })<-[:IN]-(v1:Vote)-[:BELONGS_TO]->(p:Proposal)
MATCH (o)<-[:IN]-(v2:Vote)-[:BELONGS_TO]->(p)
MATCH (v1)-[:VOTED_BY]->(m1:Member)
MATCH (v2)-[:VOTED_BY]->(m2:Member)
WHERE m1.address < m2.address AND v1.choice = v2.choice
RETURN [m1, m2] AS members, COUNT(p) AS voted_together, total_proposals_count
ORDER BY voted_together DESC
LIMIT 20