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 子句的构造中。

我的Airportclass是

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

两个问题:

  1. 我在这里错过了什么?
  2. 还有其他资源可以帮助我吗?

谢谢

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 以查看正在生成的内容。

关于更多资源的第二个问题 - 恐怕没有 :(