6

我正在尝试做的事情

对于 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

出了什么问题

如果我删除 depth 部分,则查询有效,但当然,然后只允许和 之间的*1..100一种关系。selfancestors

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

错误:应该rel是地图,但它是一个集合

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

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

我将不胜感激任何帮助来解决这个问题。谢谢!

4

1 回答 1

8

命名法

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

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

错误原因

预期rel是一个地图,但它是一个集合”错误的原因确实rel不是指每个单独的关系,而是指匹配关系的整个集合。

例如,请参阅文档中的此处:MATCH / 可变长度关系中的关系变量

解决方案

首先,确认标识符指的是一个集合(即一组多个项目)并调用它rels而不是rel. 然后,在WHERE子句中,声明条件必须使用predicate应用于集合中的所有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

ALL 谓词在文档中进行了解释:Functions / Predicate Functions

我被相关问题的这个stackoverflow回答引导到了这个解决方案。

查询时间长

不幸的是,询问关系属性确实会花费大量时间。上面的查询在数据库中只有几个节点,在我的开发机器上占用了 3000 多毫秒。

于 2013-11-07T23:02:40.330 回答