【问题标题】:Cypher query: find path by relationship propertiesCypher 查询:通过关系属性查找路径
【发布时间】:2021-04-29 16:06:38
【问题描述】:

我的问题与这个主题非常接近:Cypher query: Finding all paths between two nodes filtered by relationship properties 但我想要做的是找到沿着路径增加关系属性值的路径。因此,在之前的主题中,示例解决方案路径(从 A 到 D)将是:

A->DA->B->D

我使用了上一个主题的解决方案

START a=node(1), d=node(4) 
MATCH p=a-[r:ACTIVATES*..]->d 
WITH head(relationships(p)) as r1,p
WHERE all(r2 in relationships(p) 
      where r2.temperature > r1.temperature) 
return p;

它适用于这个例子。问题是当路径具有超过 2 个关系时,例如:

    activates:50      activates:70      activates:60
(A)-------------->(B)-------------->(C)-------------->(D)

不幸的是,这条路径也匹配。

有没有办法用密码编写这个查询,否则我将不得不使用 gremlin 代替?

感谢您的任何建议。

更新:我需要的是一些结构,例如(用伪编程语言):

WITH head(relationships(p)) as r1,p
FOREACH(r2 in tail(relationships(p)):
    r1.temperature < r2.temperature, r1 = r2)

但如果可能的话,在密码中。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这个在我的例子中有效

    START a=node(1), d=node(4) 
    MATCH p=a-[r:ACTIVATES*..]-d 
    WITH head(relationships(p))as r1,last(relationships(p))as r2,p
    WHERE all(r3 in relationships(p) 
          where r2.temperature > r1.temperature AND NOT r3.temperature < r1.temperature) 
    return p;
    

    更新:有没有办法使用节点属性来做到这一点?

    【讨论】:

    • 嗨。谢谢你的回答。但这对我不起作用。这实际上匹配 (A)--50-->(B)--70-->(C)--60-->(D) 但我只需要匹配 ( A)--50-->(B)--60-->(C)--70-->(D)
    • 理论上可以添加具有此属性的特殊节点。但在我的情况下,它会导致极其庞大和复杂的图(现在我的图有 100k+ 个节点,我计算过这种变化会导致数百个 100M+ 节点)
    • 如果节点属性可用于增量属性路径查找,您可以将关系的属性值添加到现有节点,例如foreach(r in relationships(p): FOREACH(x in nodes(p):SET x.value=r.value))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多