将节点与具有关系的公共节点匹配-Neo4j Cypher
我有许多用户节点和技能节点。这是技能和用户之间的关系将节点与具有关系的公共节点匹配-Neo4j Cypher,neo4j,cypher,intersect,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, exper
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)(s1:Skill),
(u2)-[:知道]->(s2:技能)/(2)
具有
u1,u2,
计数(不同的s1)为s1Count,计数(不同的s2)为s2Count/(3)
匹配(u1)-[:知道]->(s:技能)=s1计数和
commonSkillsCount/0.5>=s2Count/(7)
返回u1,u2
按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()
函数)。下面是我对a的一个修改:
MATCH(u1:User)-[:KNOWS]->(:Skill)(s1:Skill),
(u2)-[:知道]->(s2:技能)/(2)
具有
u1,u2,
计数(不同的s1)为s1Count,计数(不同的s2)为s2Count/(3)
匹配(u1)-[:知道]->(s:技能)=s1计数和
commonSkillsCount/0.5>=s2Count/(7)
返回u1,u2
按u1.name、u2.name排序
我们寻找
u1
,u2
用户,这些用户至少有一项共同技能(1)。然后我们分别收集他们的个人技能(2)并统计他们(3),同时收集他们的共同技能(4)并统计他们(5)。然后我们删除(u1,u2)
和(u2,u1)
对(例如来自(爱丽丝,鲍勃)
和(Bob,Alice)
我们只保留前者(6)并检查他们的常用技能数量是否超过阈值(7)。(在Cypher-IIRC中,浮点运算有时很棘手,如果我们将/0.5
移动到不等式的右侧,如sXCount*0.5
,我们就必须使用toFloat()
功能).检查此问题:-与您的问题非常相似。检查此问题:-与您的问题非常相似。效果完美!与uni的双向关系稍微改变后。Thanks@user2558013没问题。方向很好-我修复了查询中的双向关系。请不要忘记接受/upt他回答说。工作完美!在和uni的双向关系发生了一点变化之后。Thanks@user2558013没问题。方向上的观点很好-我修复了查询中的双向关系。请不要忘记接受/投票。
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