将节点与具有关系的公共节点匹配 - Neo4j Cypher

Match nodes with common nodes with a relationship - Neo4j Cypher

我有多个用户节点和技能节点。技能和用户之间的关系。

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM "file:/xyz.csv" AS row FIELDTERMINATOR '|'
WITH row
LIMIT 15

CREATE (u:User {company: row.company, salary: row.salary_float,         designation: row.designation, experience: row.experience_float})

FOREACH (s IN split(row.tag_skill, "@") |
MERGE (skill:SKILL {name: s})
ON CREATE SET skill.name = s
CREATE (u)-[:KNOWS]->(skill))

我还需要用户节点之间的关系 如果用户 A 连接到技能节点 [s1,s2,s3,s4,s5,s6] 的号码 如果用户 B 连接到 [s1,s3,s4,s6]

如果用户 A 和用户 B 至少有 50% 的技能匹配,则他们处于关系(相似)。

在这个例子中,A 与 B 有关系,因为他们有 s1、s3、s4、s6,匹配度超过 50%

似乎无法理解这个密码查询。

这是我对 :

的回答的改编版
MATCH (u1:User)-[:KNOWS]->(:Skill)<-[:KNOWS]-(u2:User) // (1)
MATCH
  (u1)-[:KNOWS]->(s1:Skill),
  (u2)-[:KNOWS]->(s2:Skill) // (2)
WITH
  u1, u2, 
  COUNT(DISTINCT s1) AS s1Count, COUNT(DISTINCT s2) AS s2Count // (3)
MATCH (u1)-[:KNOWS]->(s:Skill)<-[:KNOWS]-(u2) // (4)
WITH
  u1, u2,
  s1Count, s2Count, COUNT(s) AS commonSkillsCount // (5)
WHERE
  // we only need each u1-u2 pair once
  ID(u1) < ID(u2) AND // (6)
  // similarity
  commonSkillsCount / 0.5 >= s1Count AND
  commonSkillsCount / 0.5 >= s2Count // (7)
RETURN u1, u2
ORDER BY u1.name, u2.name

我们寻找 u1u2 位至少拥有一项共同技能 (1) 的用户。然后我们分别收集他们的个人技能 (2) 并计算它们 (3),同时收集他们的共同技能 (4) 并计算它们 (5)。然后我们删除 (u1, u2)(u2, u1) 对之一(例如从 (Alice, Bob)(Bob, Alice) 我们只保留前者(6)并检查他们的共同技能的数量是否是高于阈值 (7)。(在 Cypher - IIRC 中,浮点运算有时很棘手,如果我们将 / 0.5 移动到不等式的右侧,如 sXCount * 0.5,我们必须使用 toFloat() 函数).