neo4j查询构造SyntaxException
neo4j query construction SyntaxException
我是第一次使用 neo4j 编写 .NET 机场应用程序。我有一个 API 并且可以获取数据库中的对象(在本例中为机场)。我还可以使用
创建新机场
public void Post([FromUri]string name, [FromUri]string code, [FromUri]string city, [FromUri]string state)
{
string query = "(:Airport{name:'" + name + "',code:'" + code.ToUpper() + "',city:'" + city + "',state:'" + state.ToUpper() + "'})";
var q = WebApiConfig.GraphClient.Cypher.Create(query);
q.ExecuteWithoutResults();
}
效果很好。但我也想确保数据库中不存在机场。所以我尝试在代码中添加:
var existing = WebApiConfig.GraphClient.Cypher.Match("(a:Airport)")
.Where((Airport a) => a.Code.Equals(code.ToUpper()))
.Return(a => a.As<Airport>());
但是当我 运行 这段代码时,它总是抛出一个 SyntaxException
。我认为这是在 where 子句的构造中。
我的Airport
class是
public class Airport
{
public string City { get; set; }
public string State { get; set; }
public string Code { get; set; }
}
我当前使用的资源是https://github.com/Readify/Neo4jClient/wiki/cypher。
两个问题:
- 我在这里错过了什么?
- 还有其他资源可以帮助我吗?
谢谢
SyntaxException
被抛出是因为 Neo4jClient
不知道如何处理 .Equals
- 如果你进行查询并查看 existing.Query.DebugQueryText
你我会看到它的输出(我将 'lax' 作为 code
传递):
MATCH (a:Airport)
WHERE a.Code"lax"
RETURN a
SyntaxException
来自 WHERE a.Code"lax"
- 因此您需要首先改为使用 ==
运算符:
var existing = gc.Cypher.Match("(a:Airport)")
.Where((Airport a) => a.Code == code.ToUpper())
.Return(a => a.As<Airport>());
现在,如果我们查看 QueryDebugText
,我们会得到:
MATCH (a:Airport)
WHERE (a.Code = "lax")
RETURN a
但是 "lax" 是小写的 - 我们把 ToUpper()
放在那里,所以它应该是 "LAX" 对吗??
Neo4jClient
的一个细微差别是它需要具有查询所需的详细信息,所以这样做:
code = code.ToUpper();
var existing = gc.Cypher.Match("(a:Airport)")
.Where((Airport a) => a.Code == code)
.Return(a => a.As<Airport>());
将生成:
MATCH (a:Airport)
WHERE (a.Code = "LAX")
RETURN a
您可以使用 ToUpper
之类的方法,但最终不得不将它们放在 string.Format
或插值中:
var existing = gc.Cypher.Match("(a:Airport)")
.Where($"(a.Code = \"{code.ToUpper()}\")")
.Return(a => a.As<Airport>());
这很痛苦,因为您需要记住 \"
和 open/close 括号。
一般提示是始终查看 DebugQueryText
以查看正在生成的内容。
关于更多资源的第二个问题 - 恐怕没有 :(
我是第一次使用 neo4j 编写 .NET 机场应用程序。我有一个 API 并且可以获取数据库中的对象(在本例中为机场)。我还可以使用
创建新机场public void Post([FromUri]string name, [FromUri]string code, [FromUri]string city, [FromUri]string state)
{
string query = "(:Airport{name:'" + name + "',code:'" + code.ToUpper() + "',city:'" + city + "',state:'" + state.ToUpper() + "'})";
var q = WebApiConfig.GraphClient.Cypher.Create(query);
q.ExecuteWithoutResults();
}
效果很好。但我也想确保数据库中不存在机场。所以我尝试在代码中添加:
var existing = WebApiConfig.GraphClient.Cypher.Match("(a:Airport)")
.Where((Airport a) => a.Code.Equals(code.ToUpper()))
.Return(a => a.As<Airport>());
但是当我 运行 这段代码时,它总是抛出一个 SyntaxException
。我认为这是在 where 子句的构造中。
我的Airport
class是
public class Airport
{
public string City { get; set; }
public string State { get; set; }
public string Code { get; set; }
}
我当前使用的资源是https://github.com/Readify/Neo4jClient/wiki/cypher。
两个问题:
- 我在这里错过了什么?
- 还有其他资源可以帮助我吗?
谢谢
SyntaxException
被抛出是因为 Neo4jClient
不知道如何处理 .Equals
- 如果你进行查询并查看 existing.Query.DebugQueryText
你我会看到它的输出(我将 'lax' 作为 code
传递):
MATCH (a:Airport)
WHERE a.Code"lax"
RETURN a
SyntaxException
来自 WHERE a.Code"lax"
- 因此您需要首先改为使用 ==
运算符:
var existing = gc.Cypher.Match("(a:Airport)")
.Where((Airport a) => a.Code == code.ToUpper())
.Return(a => a.As<Airport>());
现在,如果我们查看 QueryDebugText
,我们会得到:
MATCH (a:Airport)
WHERE (a.Code = "lax")
RETURN a
但是 "lax" 是小写的 - 我们把 ToUpper()
放在那里,所以它应该是 "LAX" 对吗??
Neo4jClient
的一个细微差别是它需要具有查询所需的详细信息,所以这样做:
code = code.ToUpper();
var existing = gc.Cypher.Match("(a:Airport)")
.Where((Airport a) => a.Code == code)
.Return(a => a.As<Airport>());
将生成:
MATCH (a:Airport)
WHERE (a.Code = "LAX")
RETURN a
您可以使用 ToUpper
之类的方法,但最终不得不将它们放在 string.Format
或插值中:
var existing = gc.Cypher.Match("(a:Airport)")
.Where($"(a.Code = \"{code.ToUpper()}\")")
.Return(a => a.As<Airport>());
这很痛苦,因为您需要记住 \"
和 open/close 括号。
一般提示是始终查看 DebugQueryText
以查看正在生成的内容。
关于更多资源的第二个问题 - 恐怕没有 :(