我想选择db中与任何其他节点没有给定关系类型的所有节点。
这是我的数据库结构:我有用户节点发布事件节点。发布关系更具体,有各种类型的关系,比如type1
和type2
。
如何快速选择与事件有type1
关系但与事件没有type2
关系的所有用户节点。
这是我现在使用的查询:
START u = node:users("*:*")
MATCH (ev1)<-[r1:type1]-(u)-[r2?:type2]->(ev2)
WHERE r2 IS NULL
RETURN u
问题是r2是一个可选关系。这使得上面的查询非常缓慢,确认了neo4j文档的内容。
如何提高此查询的速度?我可以更好地建模数据以提高性能吗?
谢谢! 亚历克斯
答案 0 :(得分:4)
我发现的解决方案有两个,具体取决于用例。我有两个:
type1
但没有type2
类关系的所有用户节点。 两个查询可以解决这个问题,一个使用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
查找类型为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 返回你
鉴于我的问题有一个性能说明,我将添加两条建议来加速上述查询:
WHERE
移动到索引查询。一切都在努力减少起始节点的数量!注意!重型索引会降低写入性能。有关可用的查询语法,请参阅lucene docs。