如何从Neo4j Cypher搜索结果中排除连接到特定节点的节点

时间:2014-12-21 20:44:45

标签: neo4j cypher

我需要执行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; 

1 个答案:

答案 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语句中检查每一项,减慢一切。