Neo4j:与深度关系的条件

fie*_*edl 6 neo4j cypher

我想做什么

作为Neo4j的新手,我试图在Neo4j图数据库中找到Cypher的某些节点.节点应该通过某种类型的关系链连接到关系的进一步条件:

// Cypher
START self = node(3413)
MATCH (self)<-[rel:is_parent_of*1..100]-(ancestors)
WHERE rel.some_property = 'foo'
RETURN DISTINCT ancestors
Run Code Online (Sandbox Code Playgroud)

出了什么问题

如果我删除深度部分*1..100,查询工作,但当然,然后只允许self和之间的一个关系ancestors.

但是,如果我允许通过引入深度ancestors几步之遥,查询将失败:self*1..100

错误:预计rel是地图,但它是一个集合

我想,也许这种语法定义relis_parent_of*1..100而不是定义rel为类型关系is_parent_of并允许更大的关系深度.

所以,我试图通过使用括号来明确我的意图:[(rel:is_parent_of)*1..100.但这会导致语法错误.

我很感激任何帮助来解决这个问题.谢谢!

fie*_*edl 8

命名法

调用*1..100 深度起源于neography ruby​​ gem的命名法,这是使用抽象depth方法完成的.

在neo4j中,这称为可变长度关系,如文档中所示:MATCH /可变长度关系.

错误原因

事实上," 预期rel是地图但它是集合 "错误的原因rel并不是指每个单一关系,而是指整个匹配关系的集合.

有关示例,请参阅文档中的:MATCH /可变长度关系中的关系变量.

首先,确认标识符引用了一个集合(即一组多个项目)并将其称为rels而不是rel.然后,在WHERE子句中,声明条件必须使用谓词应用于集合中的所有rel项.relsALL

// Cypher
START self = node(3413)
MATCH (self)<-[rels:is_parent_of*1..100]-(ancestors)
WHERE ALL (rel in rels WHERE rel.some_property = 'foo')
RETURN DISTINCT ancestors
Run Code Online (Sandbox Code Playgroud)

ALL谓词在此说明文档中:功能/谓词函数.

我通过这个相关问题的stackoverflow回答引出了这个解决方案.

查询时间长

不幸的是,要求关系属性确实花费了大量时间.上面的查询只有数据库中的几个节点,在我的开发机器上需要超过3000毫秒.