首页 > 解决方案 > Neo4j:匹配具有另外 2 个共同属性的节点

问题描述

我正在处理包含 4 列数据的 csv 文件中的数据:hotelName, hotelPool, hotelSpa, hotelGym,hotelName酒店的唯一名称在哪里,hotelPool列出酒店拥有的游泳池类型,酒店拥有hotelSpa的水疗中心类型,并hotelGym列出酒店有那种健身房。

样本数据如下:

第 1 行"California", "Full-size", "Full-size", "Fully-equipped"

第 2 行"Yorba", "Full-size", "None", "Full-equipped"

第 3 行"Heartbreak", "None", "Full-size", "Full-equipped"

第 4 行"Chelsea", "Full-size", "Full-size", "Fully-equipped"

如果这些酒店有 2 个或更多的共同特征,我想匹配它们。

例如,加利福尼亚州与 Yorba 有 2 个共同点——两家酒店都有全尺寸游泳池和设备齐全的健身房。

加州与 Heartbreak 也有 2 个共同点——两家酒店都拥有全尺寸的水疗中心和设备齐全的健身房。

加州也与切尔西有 3 个共同点——两家酒店都设有全尺寸游泳池、全尺寸水疗中心和设备齐全的健身房。

我想要的输出是具有 2 个或更多共同特征的酒店对,如下所示:

第 1California, Yorba, 2 行 第 2California, Heartbreak, 2 行 第 3 行California, Chelsea, 3

如何根据 2 个或更多特征进行匹配?

标签: neo4jcypher

解决方案


这应该这样做:

// get all hotels
MATCH (h:Hotel)

// create hotel pairs, avoiding duplicates
WITH COLLECT(h) AS hotels
UNWIND hotels AS h1
UNWIND hotels AS h2
WITH h1,h2 
WHERE id(h1)>id(h2)

//loop through keys and count same values 
WITH h1, h2,
     REDUCE(i=0, key in keys(h1)  |
            i
            + CASE WHEN h1[key] = h2[key] THEN 1 ELSE 0 END
     )  AS sameCount

// set your limit
WHERE sameCount >=3 

RETURN h1.hotelName, h2.hotelName , sameCount

推荐阅读