Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将节点与具有关系的公共节点匹配-Neo4j Cypher_Neo4j_Cypher_Intersect - Fatal编程技术网

将节点与具有关系的公共节点匹配-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