我正在使用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;
答案 0 :(得分:1)
问题是您将course
和frequency
存储在查询中的两个不同变量中,如果您想在课程中添加频率,则必须稍后设置{{1} }}
实际上您正在执行course.setFrequency(c)
,但Return(course => course.As<Course>())
仅包含标题,因为频率存储在course
中。所以你必须得到c
并稍后在c
中设置它。