Neo4j指定用户发布帖子点赞数查询(含错误修正及C#实现)求助
修正后的Cypher语句及问题解析
先帮你梳理下原语句里的几个问题:
- 关系类型必须加冒号
:前缀,比如[:WRITES],原语句里遗漏了这个格式要求 WHERE user ="xyz"是直接把User节点和字符串做比较,这显然不对——你应该匹配节点的具体属性(比如用户名属性,假设是username),写成user.username = "xyz"- 如果想完整展示用户的所有帖子(包括没有点赞的,点赞数显示0),得用
OPTIONAL MATCH替代直接的MATCH,否则无点赞的帖子会被过滤掉
情况1:仅返回有点赞记录的帖子
MATCH (user:User)-[:WRITES]->(myp:Post)<-[l:LIKES]-() WHERE user.username = "xyz" RETURN myp, count(l) AS likeCount
情况2:返回用户所有帖子(含无点赞的,点赞数为0)
这个场景更实用,能完整展示用户的发帖数据:
MATCH (user:User)-[:WRITES]->(myp:Post) WHERE user.username = "xyz" OPTIONAL MATCH (myp)<-[l:LIKES]-() RETURN myp, count(l) AS likeCount
C#实现步骤
首先需要安装Neo4j官方的.NET驱动包,在NuGet里搜索Neo4j.Driver并安装最新稳定版即可。
完整示例代码
using Neo4j.Driver; using System; using System.Collections.Generic; using System.Threading.Tasks; public class Neo4jPostHandler { private readonly IDriver _neo4jDriver; // 初始化驱动,替换成你的Neo4j连接信息 public Neo4jPostHandler(string uri, string dbUsername, string dbPassword) { _neo4jDriver = GraphDatabase.Driver(uri, AuthTokens.Basic(dbUsername, dbPassword)); } // 查询指定用户的帖子及对应点赞数 public async Task<List<PostWithLikeCount>> FetchUserPostsWithLikes(string targetUsername) { var resultList = new List<PostWithLikeCount>(); // 创建会话执行查询 using var session = _neo4jDriver.Session(); var queryResult = await session.RunAsync(@" MATCH (user:User)-[:WRITES]->(myp:Post) WHERE user.username = $username OPTIONAL MATCH (myp)<-[l:LIKES]-() RETURN myp, count(l) AS likeCount ", new { username = targetUsername }); // 遍历解析结果 await foreach (var record in queryResult) { // 提取Post节点的属性,根据你的实际节点属性调整字段 var postNode = record["myp"].As<INode>(); var postInfo = new Post { Id = postNode.Id, Title = postNode.Properties["title"].As<string>(), Content = postNode.Properties["content"].As<string>() // 其他Post属性按需添加,比如发布时间createTime等 }; resultList.Add(new PostWithLikeCount { Post = postInfo, LikeCount = record["likeCount"].As<int>() }); } return resultList; } // 释放驱动资源 public void Dispose() { _neo4jDriver?.Dispose(); } } // 辅助类:存储Post的基础信息 public class Post { public long Id { get; set; } public string Title { get; set; } public string Content { get; set; } // 可根据你的节点结构添加更多属性 } // 辅助类:存储帖子+点赞数的组合结果 public class PostWithLikeCount { public Post Post { get; set; } public int LikeCount { get; set; } }
使用示例
// 替换为你的Neo4j连接参数 await using var postHandler = new Neo4jPostHandler("bolt://localhost:7687", "neo4j", "your-db-password"); var userPosts = await postHandler.FetchUserPostsWithLikes("xyz"); // 遍历输出结果 foreach (var item in userPosts) { Console.WriteLine($"帖子标题:{item.Post.Title},点赞数:{item.LikeCount}"); }
内容的提问来源于stack exchange,提问作者Swaroop
相关产品推荐
相关产品推荐

