我确信这个问题已被提出但我找不到。
我有一张社交图,我希望能够在一个结果中根据3种不同的关系向人们展示建议。
我有3个不同的节点(技能,兴趣,标题) 每个人的关系分别为SKILL_OF,INTEREST_OF和IS_TITLED。
我想拥有匹配此人的单个(如果可能的话)唯一的结果集,然后找到具有相同技能,兴趣和职位的人。
我尝试从2个结果开始(然后想在之后添加标题),但这就是我所拥有的。
MATCH (p:Person { username:'wkolcz' })-[INTEREST_OF]->(Interest)<-[i:INTEREST_OF]-(f:Person)
MATCH(p)-[SKILL_OF]->(s:Skill)<-[sk:SKILL_OF]-(sf:Person)
RETURN f.first_name,f.last_name, sf.first_name, sf.last_name, i, s
我试图让匹配的人变成同一个变量但是,正如专家所知,这个变量失败了。我得到了一个结果集但是对我来说没有意义我怎么能显示它。
我想要一个名单中的first_name,last_name,2的用户名和奖励积分我可以得到比赛也返回(i和s)所以我可以显示匹配的结果(这个人也有技能)在X或此人也有兴趣X)
谢谢,让我知道!
答案 0 :(得分:2)
[EDITED]
这是一个非常有趣的问题。
我提供了一个解决方案:
wkolcz
作为单独的集合。 (我认为数据库中的人可以有多种兴趣和技能。)该解决方案在单个MATCH
条款中找到所有具有共同兴趣和/或技能的人。
MATCH (p:Person { username:'wkolcz' })-[r1:INTEREST_OF|SKILL_OF]->(n)<-[r2:INTEREST_OF|SKILL_OF]-(f)
WHERE TYPE(r1) = TYPE(r2)
WITH f, COLLECT(TYPE(r1)) AS ts, COLLECT(n.name) AS names
RETURN f.first_name, f.last_name, f.username,
REDUCE(s = { interests: [], skills: []}, i IN RANGE(0, LENGTH(ts)-1) | CASE
WHEN ts[i] = "INTEREST_OF"
THEN { interests: s.interests + names[i], skills: s.skills }
ELSE { interests: s.interests, skills: s.skills + names[i]} END ) AS shared;
显示以下示例结果的
+---------------------------------------------------------------------------------------------+
| f.first_name | f.last_name | f.username | shared |
+---------------------------------------------------------------------------------------------+
| "Fred" | "Smith" | "fsmith" | {interests=[Bird Watching], skills=[]} |
| "Oscar" | "Grouch" | "ogrouch" | {interests=[Bird Watching, Politics], skills=[]} |
| "Wilma" | "Jones" | "wjones" | {interests=[Bird Watching], skills=[Woodworking]} |
+---------------------------------------------------------------------------------------------+