【发布时间】:2019-08-20 20:14:07
【问题描述】:
我有疑问:
MATCH (a:vertex {label: 'a'})<-->(b:vertex {label: 'b'})
MATCH (a)<-->(e:vertex {label: 'e'})
MATCH (b)<-->(c:vertex {label: 'c'})
MATCH (b)<-->(e:vertex {label: 'e'})
MATCH (c)<-->(d:vertex {label: 'd'})
MATCH (d)<-->(e)
MATCH (d)<-->(a)
return a,b,c,d,e
还有一个由 50.000 个顶点和 10.000.000 条边组成的图。 它总共只有标签 a,b,c,d,e,f,我知道这个匹配存在。
我已经安装了neo4j.apoc 插件以利用我机器上的 8 个内核,并且我已经尝试了以下查询:
CALL apoc.periodic.iterate(
"MATCH (a:vertex {label: 'a'})<-->(b:vertex {label: 'b'})
MATCH (a)<-->(e:vertex {label: 'e'})
MATCH (b)<-->(c:vertex {label: 'c'})
MATCH (b)<-->(e:vertex {label: 'e'})
MATCH (c)<-->(d:vertex {label: 'd'})
MATCH (d)<-->(e)
MATCH (d)<-->(a)
return a,b,c,d,e",
"return DISTINCT([ID(a),ID(b),ID(c),ID(d),ID(e)]) AS LIST", {batchSize:10000, parallel:true})
这个查询只使用了几个核心,它基本上从不返回结果,它只是永远处理。我一直在看
函数apoc.path.subgraphAll(startNode <id>Node/list, {maxLevel, relationshipFilter, labelFilter, bfs:true, filterStartNode:true, limit:-1}) yield nodes, relationships
但由于我对 NEO4J 和 Apoc 非常陌生,所以我实际上不明白如何填写这些关系。有没有人知道这些东西并且可以指出我正确的方向?
编辑:我有一个自定义的 java 图形实现,它并行执行并在大约 600 毫秒内完成,我希望 NEO4J 能够更快地完成它,但是由于查询只使用 1 个线程,因此需要很长时间,这这就是我一直在研究 Apoc 的原因。我也愿意使用 Apoc 以外的其他东西,也许我的查询可以仅使用 NEO4J 进行优化并更快地完成。我在 :vertex(label) 上创建了一个索引,所以至少该部分会进行索引搜索。
编辑2: 这个查询应该做同样的事情,而且显然更漂亮:
CALL apoc.periodic.iterate(
"MATCH (a:vertex {label:'a'})--(b:vertex {label: 'b'})--(c:vertex {label: 'c'})--(d:vertex {label: 'd'})--(e:vertex {label: 'e'}) WHERE (c)<-->(d) AND (b)--(e) AND (d)--(a)
RETURN a,b,c,d,e",
"return DISTINCT([ID(a),ID(b),ID(c),ID(d),ID(e)]) AS LIST", {batchSize:10000, parallel:true})
但它仍然从未停止处理,我什至将图形调整为 10k 个顶点和 500 万条边。
【问题讨论】:
标签: neo4j pattern-matching neo4j-apoc