微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在neo4j的FOREACH子句中定义变量,如何查找两个节点的公共属性数

如何解决如何在neo4j的FOREACH子句中定义变量,如何查找两个节点的公共属性数

正如标题所示,我在neo4j中定义和存储变量时遇到问题,下面是我的代码

// 6. display a list of pairs of restaurants having more than three features in common.
MATCH(p1:Place),(p2:Place)
WHERE p1.placeId <> p2.placeId
WITH count = 0
FOREACH(ignoreMe in CASE 
    WHEN
    p1.property1 = p2.property1 THEN [1] 
    WHEN
    p1.property2 = p2.property2 THEN [1]
    WHEN
    ...//omit for university academic requirement
    ELSE []    
    END |
    count = count + 1
)
FOREACH(ignoreMe in CASE 
    WHEN
    count > 3 THEN [1]
    ELSE []    
    END |
    RETURN p1,p2
)

我想找到一对共有3个以上共同特征的地方。当我运行此代码时,会出现问题,因为在foreach内部我找不到变量计数。有其他解决方案吗?还是有更有效的方法来查找两个节点的通用特征?任何建议表示赞赏。

error screenshot

解决方法

您应该使用REDUCE而不是FOREACH

例如:

MATCH(p1:Place),(p2:Place)
WHERE p1.placeId < p2.placeId
WITH
  p1,p2,REDUCE(
    s = 0,k IN [
      'isFranchise','parkingArrangements','placeAccessibility','placeAlcohol','placeArea','placeDressCode','placeOtherServices','placePrice','placeSmoking'] |
    CASE WHEN p1[k] = p2[k] THEN s + 1 ELSE s END
    ) AS count
WHERE count > 3
RETURN p1,p2

p1.placeId < p2.placeId测试使用<运算符而不是<>,以避免对同一对节点进行两次评估(反向)。

注意:MATCH子句会导致O(N ^ 2)复杂度的笛卡尔积,因此这是一个昂贵的查询。

,

问题不在于FOREACH,而是因为count变量在以下位置之前被错误地初始化:

MATCH(p1:Place),(p2:Place)
WHERE p1.placeId <> p2.placeId
WITH count = 0
...

应该成为

MATCH(p1:Place),(p2:Place)
WHERE p1.placeId <> p2.placeId
WITH p1,0 AS count
...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。