在 C# 中编写 Neo4J Cypher 查询
Writing Neo4J Cypher query in C#
我有一个连接到 Neo4j 数据库的 MVC Asp.Net 应用程序。在我的数据库中,movie
和 user
实体之间存在关系 (m:Movie)<-[r:HAS_WATCHED_MOVIE]-(u:User)
。
我想要做的是 return 一个 IEnumerable<Movie>
包含前 3 部电影(顶级电影是具有最多 HAS_WATCHED_MOVIE
关系的电影)按降序排列。
我已经想出一个 Cypher 查询来执行此操作,它是这样的:
MATCH (m:Movie)<-[r:HAS_WATCHED_MOVIE]-(b)
RETURN m, COUNT(r)
ORDER BY COUNT(r) DESC
LIMIT 3
由于我是 Neo4j C# 客户端的新手,我不确定如何在 C# 中编写此查询?
使用Neo4jClient
var client = new BoltGraphClient("bolt://localhost:7687", "neo4j", "neo");
client.Connect();
var query = client.Cypher
.Match("(m:Movie)<-[r:HAS_WATCHED_MOVIE]-(b)")
.Return((m,r) => new {
Movie = m.As<Movie>(),
Count = r.Count()
})
.OrderByDescending("Count")
.Limit(3);;
foreach(var result in query.Results)
Console.WriteLine($"'{result.Movie.Title}' had {result.Count} watchers");
对于这个,我将 Movie
class 定义为:
public class Movie{
[JsonProperty("title")]
public string Title {get;set;}
}
使用Neo4j-Driver
using (var driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "neo")))
{
using (var session = driver.Session())
{
using (var tx = session.BeginTransaction())
{
IStatementResult results = tx.Run(
@"MATCH (m:Movie)<-[r:HAS_WATCHED_MOVIE]-(b)
RETURN m, COUNT(r)
ORDER BY COUNT(r) DESC
LIMIT 3");
foreach (IRecord result in results)
{
var node = result["m"].As<INode>();
var title = node.Properties["title"]?.As<string>();
var count = result["COUNT(r)"].As<long>();
var movie = new Movie {
Title = title,
};
Console.WriteLine($"'{movie.Title}' had {count} watchers");
}
}
}
}
NB. 我只在这一个中完成了 new Movie
位,因为你说你想要一个 IEnumerable<Movie>
响应。
想法
Neo4jClient
没有 return 和 IEnumerable<Movie>
,因为您在 RETURN
中使用 COUNT
调用,您需要做类似的事情:
var query = gc.Cypher
.Match("(m:Movie)<-[r:HAS_WATCHED_MOVIE]-(b)")
.With("m, COUNT(r) AS count")
.Return((m, r) => m.As<Movie>())
.OrderByDescending("count")
.Limit(3);
在 returning 之前使用 WITH
执行 COUNT
。您 没有 使用 Neo4j-Driver
版本执行此操作,因为您可以在事后伪造它,但如果您想要的只是 Movie
至:
IStatementResult results = tx.Run(
@"MATCH (m:Movie)<-[r:HAS_WATCHED_MOVIE]-(b)
WITH m, COUNT(r) AS count
RETURN m
ORDER BY count DESC
LIMIT 3");
我有一个连接到 Neo4j 数据库的 MVC Asp.Net 应用程序。在我的数据库中,movie
和 user
实体之间存在关系 (m:Movie)<-[r:HAS_WATCHED_MOVIE]-(u:User)
。
我想要做的是 return 一个 IEnumerable<Movie>
包含前 3 部电影(顶级电影是具有最多 HAS_WATCHED_MOVIE
关系的电影)按降序排列。
我已经想出一个 Cypher 查询来执行此操作,它是这样的:
MATCH (m:Movie)<-[r:HAS_WATCHED_MOVIE]-(b)
RETURN m, COUNT(r)
ORDER BY COUNT(r) DESC
LIMIT 3
由于我是 Neo4j C# 客户端的新手,我不确定如何在 C# 中编写此查询?
使用Neo4jClient
var client = new BoltGraphClient("bolt://localhost:7687", "neo4j", "neo");
client.Connect();
var query = client.Cypher
.Match("(m:Movie)<-[r:HAS_WATCHED_MOVIE]-(b)")
.Return((m,r) => new {
Movie = m.As<Movie>(),
Count = r.Count()
})
.OrderByDescending("Count")
.Limit(3);;
foreach(var result in query.Results)
Console.WriteLine($"'{result.Movie.Title}' had {result.Count} watchers");
对于这个,我将 Movie
class 定义为:
public class Movie{
[JsonProperty("title")]
public string Title {get;set;}
}
使用Neo4j-Driver
using (var driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "neo")))
{
using (var session = driver.Session())
{
using (var tx = session.BeginTransaction())
{
IStatementResult results = tx.Run(
@"MATCH (m:Movie)<-[r:HAS_WATCHED_MOVIE]-(b)
RETURN m, COUNT(r)
ORDER BY COUNT(r) DESC
LIMIT 3");
foreach (IRecord result in results)
{
var node = result["m"].As<INode>();
var title = node.Properties["title"]?.As<string>();
var count = result["COUNT(r)"].As<long>();
var movie = new Movie {
Title = title,
};
Console.WriteLine($"'{movie.Title}' had {count} watchers");
}
}
}
}
NB. 我只在这一个中完成了 new Movie
位,因为你说你想要一个 IEnumerable<Movie>
响应。
想法
Neo4jClient
没有 return 和 IEnumerable<Movie>
,因为您在 RETURN
中使用 COUNT
调用,您需要做类似的事情:
var query = gc.Cypher
.Match("(m:Movie)<-[r:HAS_WATCHED_MOVIE]-(b)")
.With("m, COUNT(r) AS count")
.Return((m, r) => m.As<Movie>())
.OrderByDescending("count")
.Limit(3);
在 returning 之前使用 WITH
执行 COUNT
。您 没有 使用 Neo4j-Driver
版本执行此操作,因为您可以在事后伪造它,但如果您想要的只是 Movie
至:
IStatementResult results = tx.Run(
@"MATCH (m:Movie)<-[r:HAS_WATCHED_MOVIE]-(b)
WITH m, COUNT(r) AS count
RETURN m
ORDER BY count DESC
LIMIT 3");