Neo4j Cypher:使用UNION创建非常大的查询

Neo4j Cypher:使用UNION创建非常大的查询,neo4j,cypher,Neo4j,Cypher,我需要从Neo4j中的不同起始节点查询多个路径(在UI中绘制),我使用UNION组合查询,但我怀疑这不是检索数据的最有效方法(我还在起始节点上使用索引)。 创建大型查询时,会发生各种令人讨厌的事情 查询如下所示: MATCH path = ((n:actor)-[*0..2]->(g)-[p:was_filmed_at]->(k:movie_set)-[l:located]->(i:state)) WHERE n.name=’john doe1' AND (g:acted_i

我需要从Neo4j中的不同起始节点查询多个路径(在UI中绘制),我使用
UNION
组合查询,但我怀疑这不是检索数据的最有效方法(我还在起始节点上使用索引)。 创建大型查询时,会发生各种令人讨厌的事情

查询如下所示:

MATCH path = ((n:actor)-[*0..2]->(g)-[p:was_filmed_at]->(k:movie_set)-[l:located]->(i:state)) 
WHERE n.name=’john doe1' AND (g:acted_in OR g:produced) 
AND p.addDate >= '2017-12-10T00:00:00+00:00' 
AND p.addDate <= '2017-12-12T08:08:06+00:00' 
AND l.addDate >= '2017-12-10T00:00:00+00:00' 
AND l.addDate <= '2017-12-12T08:08:06+00:00' 
RETURN nodes(path), relationships(path) 
LIMIT 1000

UNION 

MATCH path = ((n:actor)-[*0..2]->(g)-[p:was_filmed_at]->(k:movie_set)-[l:located]->(i:state)) 
WHERE n.name=’john doe2' AND (g:acted_in OR g:produced) 
AND p.addDate >= '2017-12-10T00:00:00+00:00' 
AND p.addDate <= '2017-12-12T08:08:06+00:00' 
AND l.addDate >= '2017-12-10T00:00:00+00:00' 
AND l.addDate <= '2017-12-12T08:08:06+00:00' 
RETURN nodes(path), relationships(path) 
LIMIT 1000

UNION 

MATCH path = ((n:actor)-[*0..2]->(g)-[p:was_filmed_at]->(k:movie_set)-[l:located]->(i:state)) 
WHERE n.name=’john doe3' AND (g:acted_in OR g:produced) 
AND p.addDate >= '2017-12-10T00:00:00+00:00' 
AND p.addDate <= '2017-12-12T08:08:06+00:00' 
AND l.addDate >= '2017-12-10T00:00:00+00:00' 
AND l.addDate <= '2017-12-12T08:08:06+00:00' 
RETURN nodes(path), relationships(path) 
LIMIT 1000
匹配路径=((n:actor)-[*0..2]->(g)-[p:was-filmed\u-at]->(k:movie\u set)-[l:located]->(i:state))
其中n.name='john doe1'和(g:acted_in或g:Producerd)
和p.addDate>=“2017-12-10T00:00:00+00:00”
p.addDate='2017-12-10T00:00:00+00:00'
和l.addDate(g)-[p:was\u filmed\u at]->(k:movie\u set)-[l:located]->(i:state))
其中n.name='john doe2'和(g:acted_in或g:Producted)
和p.addDate>=“2017-12-10T00:00:00+00:00”
p.addDate='2017-12-10T00:00:00+00:00'
和l.addDate(g)-[p:was\u filmed\u at]->(k:movie\u set)-[l:located]->(i:state))
其中n.name='john doe3'和(g:acted_in或g:Producerd)
和p.addDate>=“2017-12-10T00:00:00+00:00”
p.addDate='2017-12-10T00:00:00+00:00'

和l.addDate由于您只更改了
n.name
比较,因此可以使用重写查询,并将名称列表作为数组传递。这样:

MATCH path = ((n:actor)-[*0..2]->(g)-[p:was_filmed_at]->(k:movie_set)-[l:located]->(i:state))
WHERE n.name IN ['john doe1', 'john doe2', 'john doe3']
AND (g:acted_in OR g:produced)
AND '2017-12-10T00:00:00+00:00' <= p.addDate <= '2017-12-12T08:08:06+00:00'
AND '2017-12-10T00:00:00+00:00' <= l.addDate <= '2017-12-12T08:08:06+00:00'
RETURN nodes(path), relationships(path)
LIMIT 1000
匹配路径=((n:actor)-[*0..2]->(g)-[p:was-filmed\u-at]->(k:movie\u set)-[l:located]->(i:state))
其中n.name在['john doe1','john doe2','john doe3']
和(g:演出或g:制作)

和“2017-12-10T00:00:00+00:00”假设您只更改名称,为什么不更改您或它而不是联合路径?另外,您在查询中是否使用了配置文件?为了找到最终的瓶颈或仍然进行大型查询,我用@Bruno Peres标记了解决方案,因为它创建了一个较短的查询。谢谢此外,您还可以链接不等式,如:
和“2017-12-10T00:00:00+00:00”,还可以确保您在:actor(name)上有一个索引,用于快速查找起始索引node@InverseFalcon正确的!我已经更新了答案!谢谢你的贡献!对这正是我要找的!