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