【问题标题】:Neo4j find repeating pattern starting from nodeNeo4j 从节点开始查找重复模式
【发布时间】:2018-02-27 17:16:48
【问题描述】:

我目前正在使用 Neo4j 并尝试构建适合我用例的 Cypher 查询。我有一个具有以下结构的图表。

(NODE_A)-RELATION_A->(NODE_B)-RELATION_B->(NODE_A)-RELATION_A-> ... 重复 ...

我知道第一个 NODE_A 并希望每个后续的 NODE_ANODE_B 都匹配两个关系(RELATION_A 和 RELATION_B)。如果我构造一个密码查询,它看起来像这样。

MATCH (a:NODE_A)-[:RELATION_A]->(b:NODE_B)-[:RELATION_B]-(c:NODE_A) WHERE id(a)=1 RETURN [a,b,c] as result

但这只会返回模式:NODE_A-RELATION_A->NODE_B-RELATION_B->NODE_A

如果我遗漏了WHERE id(a) = 1,它会得到正确的结果,但它会返回所有与模式匹配的节点。

如何指定执行查询的起始节点?

【问题讨论】:

    标签: design-patterns neo4j cypher relation repeat


    【解决方案1】:

    您可能需要在此处查看 APOC 程序,因为目前没有办法仅在 Cypher 中定义节点标签或关系类型的重复序列。

    我们实际上只是将 such a feature 添加到 APOC 的 path expander procedures

    使用您的情况,用法如下所示:

    MATCH (a:NODE_A)
    WHERE id(a) = 1
    CALL apoc.path.expandConfig(a, {sequence:'NODE_A, RELATION_A>, NODE_B, RELATION_B>'}) YIELD path
    RETURN collect(last(nodes(path))) as results
    

    这将从您的起始节点展开,重复节点标签和关系的顺序。

    【讨论】:

    • 这里使用 APOC 程序是正确的。您可以使用 expandConfig 遍历树。 apoc.path.spanningTree 也与 labelFilter 一起使用。所以这适合我的用例。谢谢你:-)
    猜你喜欢
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多