【问题标题】:Getting variable length paths not involving certain relationships in neo4j cypher获取不涉及 Neo4j 密码中某些关系的可变长度路径
【发布时间】:2016-12-06 07:50:46
【问题描述】:

我知道有一个节点类型 (a:Source) 将在其他节点 (x) 上具有类型为 [:RefRel] 的出边。我想获取(a)(x) 之间的所有其他路径,它们之间至少涉及一个节点。

考虑我的图表如下:

查询应返回两个路径:a-b-c-da-b-c-e。这些路径上的节点和关系可以是任何类型。

用密码创建图表:

CREATE (a:Source)-[:RelA]->(b)-[:RelB]->(c)-[:RelC]->(d)
CREATE (c)-[:RelD]->(e)
CREATE (a)-[:RefRel]->(d)
CREATE (a)-[:RefRel]->(e)

我写的查询如下:

MATCH (a:Source)-[:RefRel]-(b)
MATCH path=(a)-[*2..]-(b)      //2.. because that means at least one node on the path
RETURN path

但它返回了整个图表。当我检查行时,由于图中的循环,它返回了很多行。

所以在查询中包含过滤器如下:

MATCH (a:Source)-[:RefRel]-(b)
MATCH path=(a)-[c*2..]-(b)
WHERE filter(rel IN c WHERE rel.name<>"RefRel")
RETURN path

但是它什么也没返回。 这里有什么问题?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您创建的所有关系都没有“名称”属性。关系有类型,这不是属性。你想用

    type(rel) &lt;&gt; "RefRel"

    此外,在您的 WHERE 上,使用 ALL() 代替 FILTER() 可能会更好。

    【讨论】:

    • ahhh all() 似乎返回两行,但 filter() 返回很多...为什么?
    • filter() 不返回布尔值,它返回过滤后的集合,所以它没有做你认为它正在做的事情,它不合适。据我所知,如果有收藏,那么它可能会将其解释为真实。相比之下, all() 返回一个布尔值,评估集合中每个元素的内部 WHERE 是否为真,这就是您最初尝试做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    相关资源
    最近更新 更多