选择缺少某种关系的节点

时间:2013-10-28 13:40:01

标签: neo4j

我想选择db中与任何其他节点没有给定关系类型的所有节点。

这是我的数据库结构:我有用户节点发布事件节点。发布关系更具体,有各种类型的关系,比如type1type2

如何快速选择与事件有type1关系但与事件没有type2关系的所有用户节点。

这是我现在使用的查询:

START u = node:users("*:*") 
MATCH (ev1)<-[r1:type1]-(u)-[r2?:type2]->(ev2) 
WHERE r2 IS NULL
RETURN u

问题是r2是一个可选关系。这使得上面的查询非常缓慢,确认了neo4j文档的内容。

如何提高此查询的速度?我可以更好地建模数据以提高性能吗?

谢谢! 亚历克斯

1 个答案:

答案 0 :(得分:4)

我发现的解决方案有两个,具体取决于用例。我有两个:

  1. 查找关系类型为type1但没有type2类关系的所有用户节点。
  2. 两个查询可以解决这个问题,一个使用optional relationships,neo4j的手册警告不要使用:

    START u = node:users("some query")
    MATCH (ev1)<-[r1:TYPE1]-(u)-[r2?:TYPE2]->(ev2)
    WHERE r2 IS NULL
    RETURN u
    

    或者使用对图案采用过滤的更快的变体。 Docs

    START u = node:users("some query")
    MATCH (ev1)<-[r1:TYPE1]-(u)
    WHERE NOT (u)-[:TYPE2]->()
    RETURN u
    
    1. 查找类型为type1但关系类型为type2的关系与具有某些属性的节点的所有用户节点。

      START u = node:users(“some query”) MATCH(ev1)&lt; - [r1:TYPE1] - (u) - [r2:TYPE2] - &gt;(ev2) WHERE ev2.property = value AND r2.property = value 返回你

    2. 鉴于我的问题有一个性能说明,我将添加两条建议来加速上述查询:

      • 在Lucene中尽可能聪明地索引,并将尽可能多的查询条件从WHERE移动到索引查询。一切都在努力减少起始节点的数量!注意!重型索引会降低写入性能。有关可用的查询语法,请参阅lucene docs
      • 使用参数化查询,以便neo4j可以缓存查询的执行策略。 docs