问题描述
正如标题所示,我在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内部我找不到变量计数。有其他解决方案吗?还是有更有效的方法来查找两个节点的通用特征?任何建议表示赞赏。
解决方法
例如:
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
...