我是第一次使用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.
两个问题:
- 我在这里错过了什么?
- 是否有其他资源可以帮助我?
谢谢
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
以查看正在生成的内容。
你的第二个问题是关于更多的资源——恐怕没有:(