Neo4j 选择缺少某种类型关系的节点
我想选择数据库中与任何其他节点没有给定关系类型的所有节点 这是我的数据库结构:我有发布事件节点的用户节点。发布关系更为具体,有各种类型的关系,例如Neo4j 选择缺少某种类型关系的节点,neo4j,Neo4j,我想选择数据库中与任何其他节点没有给定关系类型的所有节点 这是我的数据库结构:我有发布事件节点的用户节点。发布关系更为具体,有各种类型的关系,例如type1和type2 如何快速选择与事件有type1关系但与事件没有type2关系的所有用户节点 下面是我现在使用的查询: START u = node:users("*:*") MATCH (ev1)<-[r1:type1]-(u)-[r2?:type2]->(ev2) WHERE r2 IS NULL RETURN u STAR
type1
和type2
如何快速选择与事件有type1
关系但与事件没有type2
关系的所有用户节点
下面是我现在使用的查询:
START u = node:users("*:*")
MATCH (ev1)<-[r1:type1]-(u)-[r2?:type2]->(ev2)
WHERE r2 IS NULL
RETURN u
START u=node:users(“*:*”)
匹配(ev1)(ev2)
其中r2为空
返回u
问题是r2是一个可选关系。这使得上面的查询非常慢,证实了neo4j文档的说法
如何提高此查询的速度?我可以更好地建模数据以提高性能吗
谢谢大家!!
Alex我发现的解决方案有两个方面,具体取决于用例。我有两个:
type1
但不具有类型为type2
的关系的所有用户节点李>
两个查询可以解决此问题,一个使用neo4j手册警告不要使用的可选关系
:
START u = node:users("some query")
MATCH (ev1)<-[r1:TYPE1]-(u)-[r2?:TYPE2]->(ev2)
WHERE r2 IS NULL
RETURN u
START u=节点:用户(“一些查询”)
匹配(ev1)(ev2)
其中r2为空
返回u
或者使用更快的变体,对模式进行过滤
START u=节点:用户(“一些查询”)
匹配(ev1)()
返回u
type1
但不具有类型为type2
且具有特定属性的节点关系的所有用户节点
开始u=节点:用户(“某些查询”)
匹配(ev1)(ev2)
其中ev2.property=value
r2.property=value
返回u- 在Lucene中尽可能巧妙地索引,并将尽可能多的查询条件从
移动到索引查询。所有这些都是为了减少起始节点的数量!注意!大量索引会降低写入性能。有关可用的查询语法,请参见WHERE
- 使用参数化查询,以便neo4j可以缓存查询的执行策略李>
where not
构造中附加对关系/节点的引用。Ie.…其中非(u)-(r2:type2]->(ev2).
发出此错误:未知标识符ev2
。未知标识符r2
。有什么解决方案吗?因为您要在中匹配不存在的路径,而不在中,所以您不能为其部分指定变量名(它们不存在)。因此,选择where not(u)-[:type2]->(),它的意思是“通过那些没有类型为type2
的传出关系的人过滤u”。@Stefan Armbruster是的,这很有意义!我试图做的是检查用户是否与没有特定属性的节点有关系。在这种情况下,我不需要在使用参数化密码时使用where not
check.strong+1。索引总是以写性能换取读性能。所以“索引尽可能多”听起来有点误导,它应该是“索引尽可能聪明”以减少潜在的开始节点数。@StefanArmburster已修改!10倍
START u = node:users("some query")
MATCH (ev1)<-[r1:TYPE1]-(u)
WHERE NOT (u)-[:TYPE2]->()
RETURN u