通过与Cypher的不同关系获得Mutliple结果

时间:2015-09-15 17:10:14

标签: neo4j cypher

我确信这个问题已被提出但我找不到。

我有一张社交图,我希望能够在一个结果中根据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)

谢谢,让我知道!

1 个答案:

答案 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;
显示以下示例结果的

Here is a console

+---------------------------------------------------------------------------------------------+
| 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]} |
+---------------------------------------------------------------------------------------------+