neo4j查询构造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();
}

很好。但我还想确保数据库中不存在Airport。所以我试着在代码中添加:

var existing = WebApiConfig.GraphClient.Cypher.Match("(a:Airport)")
            .Where((Airport a) => a.Code.Equals(code.ToUpper()))
            .Return(a => a.As<Airport>());

但是当我运行这段代码时,它总是抛出一个SyntaxException。我认为它是在where从句的结构中。

我的Airport班是

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>());

这是一个痛苦,因为你需要记住"和开/闭括号。

一般提示是始终查看DebugQueryText以查看正在生成的内容。

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

最新更新