【问题标题】:problem with a query which has OPTIONAL MATCH in neo4jNeo4j 中具有 OPTIONAL MATCH 的查询的问题
【发布时间】:2020-02-22 12:07:20
【问题描述】:

考虑以下架构,其中橙色节点的类型为 Friend,粉色节点的类型为 fbUser

我尝试编写的查询如下:

我正在尝试匹配在特定时间范围内具有特定名称的所有节点,并且 可选地与每个 Friend 节点、每个 tagged_together 关系相关

所以我写了以下查询:

MATCH x=(:fbUser {graph_information:['admin', 'facebook']})--(f:Friend) 
OPTIONAL MATCH y=(f)-[s:TAGGED_TOGETHER]-(d:Friend) 
WITH x,f,y,d,s 
WHERE  
    f.name=~ '(?i).*ruggeri.*' AND  
    f.timestamp>'2016-02-22' AND f.timestamp<'2020-02-22' AND
    d.timestamp>'2016-02-22' AND d.timestamp<'2020-02-22'
RETURN x,y

在这种特定情况下,输出正确是我想要的,实际上我有这个:

但是如果使用这一行运行查询

WHERE  
        f.name=~ '(?i).*kirby.*' AND  
        f.timestamp>'2016-02-22' AND f.timestamp<'2020-02-22' AND
        d.timestamp>'2016-02-22' AND d.timestamp<'2020-02-22'

我期待这个输出

但我收到(no changes, no records)

为什么?

到目前为止,我的理解是,如果可选匹配没有任何结果,它会返回 null。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这里,

    WHERE  
            f.name=~ '(?i).*kirby.*' AND  
            f.timestamp>'2016-02-22' AND f.timestamp<'2020-02-22' AND
            d.timestamp>'2016-02-22' AND d.timestamp<'2020-02-22'
    

    当没有标记的朋友时,'d'将为空,不能通过这些d.timestamp条件

    您可以像下面这样更新您的查询以获得预期的结果,

    MATCH x=(:fbUser {graph_information:['admin', 'facebook']})--(f:Friend) 
    OPTIONAL MATCH y=(f)-[s:TAGGED_TOGETHER]-(d:Friend) 
    WITH x,f,y,d,s, case d when null then [] else [1] end as iterList 
    WHERE  
        f.name=~ '(?i).*ruggeri.*' AND  
        f.timestamp>'2016-02-22' AND f.timestamp<'2020-02-22' AND ALL (x in iterList WHERE 
        d.timestamp>'2016-02-22' AND d.timestamp<'2020-02-22') 
    RETURN x,y
    

    我正在创建一个基于 d 值的迭代列表。因此,当它为 null 时,我们不会检查 d 上的时间戳,因为我们正在遍历空列表。当 d 不为空时,我们将在 d 上加上时间戳。

    【讨论】:

      猜你喜欢
      • 2018-04-06
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多