【问题标题】:Neo4jClient error - SyntaxException: Parenthesis are required to identify nodes in patterns using .CreateUniqueNeo4jClient 错误 - SyntaxException:使用 .CreateUnique 识别模式中的节点需要括号
【发布时间】:2013-11-06 14:34:13
【问题描述】:

我对 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后面的连字符。

如果有人能告诉我我做错了什么,我将不胜感激。

这是两个密码查询创建一个应用程序,如果它不存在,然后创建关系,如果它不存在。

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

我想知道是否有一种方法也可以将这些组合到一个查询中?

我是否应该费心连接到根节点,或者应用程序节点是否可以浮动。我知道不再需要启动节点,所以不需要连接到根节点吗?不过,我仍然需要此代码来处理其他关系。

非常感谢您的帮助:)

编辑:这是我从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();

【问题讨论】:

  • 您的链接参考不再有效。
  • 感谢@irperez,已修复。

标签: neo4j cypher neo4jclient


【解决方案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();

(注意:虽然我没有尝试过运行它:我只是在这里输入的。)

但是你不想使用client.RootNode。这是参考节点的 API,在 2.0 中已弃用:http://docs.neo4j.org/chunked/milestone/deprecations.html。在我们有标签之前,我们只需要根节点。在这种情况下,您似乎正在使用它,以便将来可以再次找到所有应用程序节点,但是您不需要这样做,因为您现在可以根据它们的标签找到它们。

【讨论】:

  • 非常感谢@Tatham,这对我有很大帮助。我不会担心与根节点的关系,但我会将其用于其他关系。我将看一下折旧文档,因为我发现的大多数示例和教程,除了你的,都是针对 1.9 的。我也会更多地关注 Cypher,以便更好地理解它。非常感谢!
  • @TathamOddie 可以将此问题更新到当前版本的 Neo4jClient 吗?没有开始方法了。
【解决方案2】:

我认为这意味着您应该将节点标识符放在括号中:

"CREATE UNIQUE (app)-[:APP_OF]->{root}"

只要将它们组合成一个查询,这就是您想要做的。我前段时间停止使用 Neo4jClient,所以我不记得确切的语法。然而,这就是密码的样子。

START r=node({root})
MERGE (app:App {Id: {id}})
   ON CREATE app
   SET app = {newApp}
WITH r, app CREATE UNIQUE (app)-[:APP_OF]->(r)

所以基本上你只需要从根开始,然后使用 WITH 将 CREATE UNIQUE 加入到 MERGE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多