我需要执行Neo4J Cypher查询,其中从结果中排除连接到特定节点的节点。
我在下面使用该查询,但速度非常慢(几秒钟)。
我在下面做的是首先获取其他节点不应连接的节点(Context类型)。
然后我进行下一个查询,找到由同一个用户创建但在另一个上下文中的节点" help
"并排除那些也连接到" private
"上下文。
MATCH (u:User{uid:'6dbe5450-852d-11e4-9c48-b552fc8c2b90'}),
(ctxa:Context{name:"private"}), ctxa-[:BY]->u
WITH ctxa,u MATCH (s:Statement), (ctx:Context{name:"help"}), ctx-[:BY]->u,
s-[:IN]->ctx, s-[:BY]->u
WHERE NOT s-[:IN]->ctxa
RETURN DISTINCT s.uid ORDER BY s.timestamp DESC;
任何人都有更好的主意?
更新:我也试过了:
MATCH (u:User{uid:'b9745f70-a13f-11e3-98c5-476729c16049'}), (s:Statement),
(ctx:Context{name:"private"}), ctx-[:BY]->u, s-[:IN]->ctx, s-[:BY]->u
WITH s AS sta, u MATCH (s:Statement), (ctx:Context{name:"help"}),
ctx-[:BY]->u, s-[:IN]->ctx, s-[rel:BY]->u WHERE s <> sta RETURN DISTINCT s;
答案 0 :(得分:0)
发现在查询中使用DISTINCT
确实提高了速度:
MATCH (u:User{uid:'b9745f70-a13f-11e3-98c5-476729c16049'}),
(ctxa:Context{name:"private"}), ctxa-[:BY]->u
WITH DISTINCT ctxa,u
MATCH (s:Statement), s-[rel:BY]->u, (ctx:Context{name:"bodypractices"}),
ctx-[:BY]->u, s-[:IN]->ctx
WHERE NOT s-[:IN]->ctxa
RETURN DISTINCT s;
基本上问题是我没有将DISTINCT
与第一个WITH
子句一起使用,并且由于我的数据库的结构(或者可能是出于其他原因)我为ctxa获取了大量行然后在WHERE
语句中检查每一项,减慢一切。