3

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

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

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

这是我现在使用的查询:

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

问题是 r2 是一个可选的关系。这使得上述查询非常慢,证实了 neo4j 文档所说的内容。

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

谢谢!亚历克斯

4

1 回答 1

4

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

  1. 查找所有具有 type 关系type1但不具有type 关系的用户节点type2

两个查询可以解决这个问题,一个使用optional relationshipsNeo4j 的手册警告不要使用:

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

或者使用更快的变体,它对模式进行过滤。文档

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

    开始 u = node:users("some query") MATCH (ev1)<-[r1:TYPE1]-(u)-[r2:TYPE2]->(ev2) WHERE ev2.property = value AND r2.property = value返回你

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

  • 在 Lucene 中尽可能聪明地索引,并将尽可能多的查询条件从WHERE索引查询中移出。一切都是为了减少起始节点的数量!笔记!大量索引会降低写入性能。有关可用的查询语法,请参阅lucene 文档
  • 使用参数查询,以便 neo4j 可以缓存查询的执行策略。文档
于 2013-10-30T09:51:50.270 回答