很难从 Cypher 查询中取回频率
Having difficultly getting the frequency back from a Cypher query
我正在使用 Neo4j 开发大学课程推荐系统,但遇到了这个问题。
我想做的是给系统一个兴趣,然后这个兴趣将与系统中与该兴趣有关系的学生进行检查(:HAS_INTEREST),然后return学生注册的所有课程,以及他们在搜索中出现的频率(将推荐学生人数最多的课程)。为此,我使用此查询:
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 浏览器键入查询时,查询 return 是我想要的数据(课程名称和出现频率),但当我尝试在 C# 中进行密码查询时出现问题;我无法获得每门课程的频率。我可以 return 所有课程,甚至已经订购,但我需要他们似乎给出适当推荐的频率。我将在下面列出我的代码
课程Class
public class Course
{
public string title { get; set; }
public long fequency { get; set; }
}
密码查询
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;
}
我将频率属性添加到课程 class 以查看是否可以将其存储在那里,但没有成功,我已经尝试了很多不同的 .net 查询变体以查看是否可以获得频率超出了它,但似乎没有任何效果,它只是 return 课程。
tl;dr 我需要获取课程在查询结果中出现的频率,但不知道如何使用 .Net 库获取此信息。
编辑:回答
感谢 Supamiu 和 Chris Skardon 对问题的回答和解释。下面列出了最终的工作查询,这 return 是课程及其在查询中出现的频率。
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;
问题是你在查询中将 course
和 frequency
存储在两个不同的变量中,如果你想为你的课程添加频率,你必须稍后设置它 course.setFrequency(c)
.
实际上你在做 Return(course => course.As<Course>())
但 course
只包含标题,因为频率存储在 c
中。所以你也必须得到 c
并稍后在 course
中设置它。
我正在使用 Neo4j 开发大学课程推荐系统,但遇到了这个问题。
我想做的是给系统一个兴趣,然后这个兴趣将与系统中与该兴趣有关系的学生进行检查(:HAS_INTEREST),然后return学生注册的所有课程,以及他们在搜索中出现的频率(将推荐学生人数最多的课程)。为此,我使用此查询:
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 浏览器键入查询时,查询 return 是我想要的数据(课程名称和出现频率),但当我尝试在 C# 中进行密码查询时出现问题;我无法获得每门课程的频率。我可以 return 所有课程,甚至已经订购,但我需要他们似乎给出适当推荐的频率。我将在下面列出我的代码
课程Class
public class Course
{
public string title { get; set; }
public long fequency { get; set; }
}
密码查询
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;
}
我将频率属性添加到课程 class 以查看是否可以将其存储在那里,但没有成功,我已经尝试了很多不同的 .net 查询变体以查看是否可以获得频率超出了它,但似乎没有任何效果,它只是 return 课程。
tl;dr 我需要获取课程在查询结果中出现的频率,但不知道如何使用 .Net 库获取此信息。
编辑:回答
感谢 Supamiu 和 Chris Skardon 对问题的回答和解释。下面列出了最终的工作查询,这 return 是课程及其在查询中出现的频率。
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;
问题是你在查询中将 course
和 frequency
存储在两个不同的变量中,如果你想为你的课程添加频率,你必须稍后设置它 course.setFrequency(c)
.
实际上你在做 Return(course => course.As<Course>())
但 course
只包含标题,因为频率存储在 c
中。所以你也必须得到 c
并稍后在 course
中设置它。