gpt4 book ai didi

Neo4j:与深度关系的条件

转载 作者:行者123 更新时间:2023-12-04 14:28:51 24 4
gpt4 key购买 nike

我想做什么

作为 Neo4j 的新手,我正在尝试使用 找到某些节点。密码 Neo4j 图数据库。节点应该通过 连接某种类型的关系链 进一步关系条件 :

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

出了什么问题

如果我放下深度部分 *1..100 ,查询有效,但当然,然后只允许 self 之间的一种关系和 ancestors .

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

错误: 预期 rel是一张 map ,但它是一个集合

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

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

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

最佳答案

命名法

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

在 Neo4j 中,这被称为 可变长度关系 ,如文档中所示:MATCH / Variable length relationships .

错误原因

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

有关示例,请参见文档中的此处:MATCH / Relationship variable in variable length relationships .

解决方案

首先,确认标识符引用了一个集合(即一组多个项目)并将其命名为 rels而不是 rel .然后,在 WHERE条款,声明条件必须适用于所有 rel rels 中的项目使用 ALL predicate 的集合.

// 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 .

我被 this stackoverflow answer 引导到这个解决方案的一个相关问题。

查询时间长

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

关于Neo4j:与深度关系的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19847441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com