我是Neo4j和Neo4jClient的新手,我刚开始写一些流利的Cypher来创建一个关系,如果它还不存在的话。我正在运行Neo4j 2.0 beta,因为Neo4jClient wiki中的示例似乎是2.0版。
当我运行它时,我收到以下错误:
SyntaxException: Parenthesis are required to identify nodes in patterns
"CREATE UNIQUE app-[:APP_OF]->{root}"
^
应用后的连字符^。
如果有人能告诉我我做错了什么,我将不胜感激。
这是创建App的两个cypher查询(如果它尚不存在),然后创建关系(如果它不存在)。
// Create App
client.Cypher
.Merge("(app:App {Id: {id}})")
.OnCreate("app")
.Set("app = {newApp}")
.WithParams(new { id = a.Id, newApp = a })
.ExecuteWithoutResults();
// Create Relationship
client.Cypher
.Match("(app:App)")
.Where((App app) => app.Id == a.Id)
.CreateUnique("app-[:APP_OF]->{root}") // this is the error line
.WithParam("root", client.RootNode)
.ExecuteWithoutResults();
我想知道是否有办法将这些组合成一个查询呢?
我应该打扰连接到根节点,还是App节点可以浮动。我知道不再需要启动节点,因此不需要连接根目录?我仍然需要这段代码用于其他关系。
非常感谢你的帮助:)。
编辑:这是我从https://github.com/Readify/Neo4jClient/wiki/cypher-examples
开始遵循的示例graphClient.Cypher
.Match("(user1:User)", "(user2:User)")
.Where((User user1) => user1.Id == 123)
.AndWhere((User user2) => user2.Id == 456)
.CreateUnique("user1-[:FRIENDS_WITH]->user2")
.ExecuteWithoutResults();
答案 0 :(得分:1)
我认为这意味着您应该将节点标识符放在括号中:
"CREATE UNIQUE (app)-[:APP_OF]->{root}"
只要将它们组合成一个查询,这就是您想要做的事情。我不久前停止使用Neo4jClient,所以我不记得确切的语法。然而,这就是cypher的样子。
START r=node({root})
MERGE (app:App {Id: {id}})
ON CREATE app
SET app = {newApp}
WITH r, app CREATE UNIQUE (app)-[:APP_OF]->(r)
所以基本上你只需要从root开始,并使用WITH将CREATE UNIQUE加入MERGE
答案 1 :(得分:1)
这个问题就是你提供参数的方法:
.CreateUnique("app-[:APP_OF]->{root}")
.WithParam("root", client.RootNode)
您无法传递类似的节点引用。
您需要使用START
子句将节点置于查询中:
client.Cypher
.Start(new { root = client.RootNode })
.Match("(app:App)")
.Where((App app) => app.Id == a.Id)
.CreateUnique("app-[:APP_OF]->root")
.ExecuteWithoutResults();
现在,回答关于合并它们的下一个问题,这应该有效:
client.Cypher
.Start(new { root = client.RootNode })
.Merge("(app:App {Id: {id}})")
.OnCreate("app")
.Set("app = {newApp}")
.CreateUnique("app-[:APP_OF]->root") // this is the error line
.WithParams(new { id = a.Id, newApp = a })
.ExecuteWithoutResults();
(注意:我没有尝试过这样做:我只是在这里输入它。)
HOWEVER 您不想使用client.RootNode
。这是参考节点的API,在2.0:http://docs.neo4j.org/chunked/milestone/deprecations.html中已弃用。在我们有标签之前,我们只需要根节点。在这种情况下,您似乎正在使用它,以便将来可以再次找到所有应用程序节点,但是您不需要这样做,因为您现在可以根据其标签找到它们。