【问题标题】:Neo4j Cypher: Get neighbours for variable length path given condition, skip those that do not meet conditionNeo4j Cypher:获取给定条件的可变长度路径的邻居,跳过不满足条件的邻居
【发布时间】:2018-04-03 09:34:40
【问题描述】:

我正在解决一个问题,我已经将其抽象为:

(a)-[:PREVIOUS]->(b)-[:PREVIOUS]->(c)-[:PREVIOUS]->(d)-[:PREVIOUS]->(e)-[:PREVIOUS]->(f)
(b)-[:IS]->(:Colour {Name: 'Red'})
(c)-[:IS]->(:Colour {Name: 'Red'})
(d)-[:IS]->(:Colour {Name: 'Red'})
(e)-[:IS]->(:Colour {Name: 'Blue'})
(f)-[:IS]->(:Colour {Name: 'Red'})

注意,

(:Colour {Name: 'Red'}) 

是唯一的并连接到许多节点,例如

(a)-[:IS]->(:Colour {Name: Red})<-[:IS]-(b) 

但只有

(e)-[:IS]->(:Colour {Name: Blue})

我正在尝试构建一个数据相关的查询,如上图所示。我想要做的是获取一个节点及其 2 个先前的邻居。但是,有条件:

  1. 我只想返回共享相同“IS”属性的邻居。
  2. 如果存在具有不同“IS”属性的邻居,请跳过它。
  3. 如果节点的先前邻居少于 2 个,则返回 1 个或 0 个邻居。

我已经对此进行了尝试,但无法生成以下输出。上图的 COMPLETE 输出应如下所示:

a, b, c
b, c, d
c, d, f
d, f
e
f

注意,对于节点 (c),我们返回 (d)、(f) 并跳过 (e),因为它是蓝色的; (d) 应该有类似的行为。 (e) 仅返回自身,因为它是唯一的蓝色节点。有谁知道这个问题有没有简单的解决办法?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    假设每个当前未标记的节点都有一个可用于查询的标签(我将在这里使用 :Node),这应该可以工作:

    // for each node, get its color
    MATCH (n:Node)-[:IS]->(myColor)
    // find paths to all previous nodes (where the colors match)
    // this includes the starting node, which has distance 0
    MATCH path = (n)-[:PREVIOUS*0..]->(prev)
    WHERE (prev)-[:IS]->(myColor)
    // for each node, order its previous nodes by distance
    WITH n, prev
    ORDER BY length(path) ASC
    // grab first three closest (first will always be the node itself)
    WITH n, collect(prev)[..3] as prevs
    RETURN prevs
    ORDER BY size(prevs) DESC
    

    【讨论】:

    • 谢谢,这让我走上了解决问题的正确道路。我的数据集远比这个复杂(所以没有测试解决方案),但我也相信它解决了我所说的问题。非常感谢!
    • 是的,它工作得很好(除了速度)!根据我的数据验证它,完全符合我在问题中所述的要求。
    猜你喜欢
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 2017-06-14
    相关资源
    最近更新 更多