【问题标题】:Neo4j: Conditions on Relationships with DepthNeo4j:与深度关系的条件
【发布时间】:2013-11-07 21:53:09
【问题描述】:

我想要做什么

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

出了什么问题

如果我删除深度部分*1..100,查询会起作用,但当然,那么只允许selfancestors 之间存在一种关系。

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

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

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

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

如果能提供任何解决此问题的帮助,我将不胜感激。谢谢!

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    命名法

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

    在 neo4j 中,这称为可变长度关系,可以在文档中看到:MATCH / Variable length relationships

    错误原因

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

    例如,请参阅文档中的此处:MATCH / Relationship variable in variable length relationships

    解决方案

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

    // 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 多毫秒。

    【讨论】:

    • 很好的答案。确切地说应该添加WHERE ALL (rel in rels WHERE has(rel.some_property) AND rel.some_property = 'foo')
    • 你所有的链接都坏了。
    • 感谢同步,我已经更新了链接以匹配新的 neo4j 文档。
    猜你喜欢
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多