难以从Cypher查询中获得频率

时间:2016-03-29 11:29:03

标签: c# neo4j cypher neo4jclient

我正在使用Neo4j开发大学课程推荐系统,并且遇到了这个问题。

我想要做的是给系统一个兴趣,然后将对系统中与该兴趣有关系的学生(:HAS_INTEREST)检查这种兴趣,然后返回学生注册的所有课程,它们在搜索中出现的频率(建议学生人数最多的课程)。为此,我使用此查询:

MATCH (interest:Interest {description:"Computing"})<-[:HAS_INTEREST]-(student:Student),
(student)-[:ENROLLED_IN]->(course:Course)
RETURN course.title, count(course) as frequency
ORDER BY frequency DESC
LIMIT 25

当我使用Neo4j浏览器输入查询时,查询返回我想要的数据(课程名称和出现频率),但当我尝试在c#中进行密码查询时出现问题;我无法获得每门课程的频率。我可以返回所有课程,甚至已经订购,但我需要他们出现的频率给出适当的建议。我将在下面列出我的代码

课程类

    public class Course
    {
        public string title { get; set; }

        public long fequency { get; set; }
    }

Cypher查询

        public static IEnumerable<Course> GetCourseRecommendation(string interest)
        {
        var data = GraphClient.Cypher
           .Match("(i:Interest {description : {interestDesc} })<-[:HAS_INTEREST]-(student:Student)", "(student)-[:ENROLLED_IN]->(course: Course)")
           .WithParam("interestDesc", interest)
           .With((course, c) => new
           {
               course = course.As<Course>(),
               c = course.Count()
           })
           .Return(course => course.As<Course>())
           .OrderByDescending("c")
           .Limit(25)
           .Results;

        return data;
        }

我将频率属性添加到Course类中以查看是否可以将其存储在那里但没有运气,我已经尝试了很多不同的.net查询,以查看是否可以从中获取频率但是没有似乎工作,它只是返回课程。

tl; dr我需要获得课程在查询结果中出现的次数,并且不知道如何使用.Net库获取此信息。

编辑:回答

感谢 Supamiu Chris Skardon 对该问题给出答案和解释。下面列出了最终工作查询,它​​返回了它们在查询中出现的课程和频率。

            var data = GraphClient.Cypher
               .Match("(i:Interest {description : {interestDesc} })<-[:HAS_INTEREST]-(student:Student)", "(student)-[:ENROLLED_IN]->(course: Course)")
               .WithParam("interestDesc", interest)
               .Return((course, c) => new
               {
                   course = course.As<Course>(),
                   c = course.Count()
               })
               .OrderByDescending("c")
               .Limit(25)
               .Results;

1 个答案:

答案 0 :(得分:1)

问题是您将coursefrequency存储在查询中的两个不同变量中,如果您想在课程中添加频率,则必须稍后设置{{1} }}

实际上您正在执行course.setFrequency(c),但Return(course => course.As<Course>())仅包含标题,因为频率存储在course中。所以你必须得到c并稍后在c中设置它。