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

时间:2016-11-29 14:55:43

标签: neo4j cypher intersect

我有许多用户节点和技能节点。这种关系是技能和用户之间的关系。

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]

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

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

似乎无法弄清楚这个密码查询。

1 个答案:

答案 0 :(得分:2)

以下是我对similar question的答案的改编:

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)并检查他们的共同技能是否为如果我们将/ 0.5移到不等式的右侧作为sXCount * 0.5,我们必须使用{{超过阈值(7)。(Cypher-IIRC中的浮点算术有时很棘手) 1}}功能)。