【问题标题】:How can I revert syntax from Cypher 2.0.1 to Cypher 2.0.0 for my Neo4j queries?对于我的 Neo4j 查询,如何将语法从 Cypher 2.0.1 恢复到 Cypher 2.0.0?
【发布时间】:2014-02-10 00:30:37
【问题描述】:

我在查询中使用了一系列嵌套的 FOREACH 循环,这些循环在 Neo4j 的多个安装中都能正常运行,并且具有我们用于测试的匹配数据集。随着最近对 Cypher 2.0.1 的更改,我的查询不起作用。

我最初的直觉是替换 /var/lib/neo4j/lib/neo4j-cypher-2.0.0.jar 文件,但我不想把事情搞砸。有什么想法吗?

示例图:http://console.neo4j.org/?id=ktrcwx

这是查询(我强调的“**”表示发生错误的点):

$ MATCH (total:Recipe)
>     WITH count(DISTINCT total) AS tots, timestamp() AS time
>     MATCH (ia:Ingredient)<-[:HAS_INGREDIENT]-(recab:Recipe)-[recHasB:HAS_INGREDIENT]->(ib:Ingredient)
>       WHERE id(ia)=5167
>       WITH DISTINCT ib AS idB, count(DISTINCT recab) AS recAB , count(DISTINCT recHasB) AS recB, tots, time
>     MATCH (i:Ingredient)<-[:HAS_INGREDIENT]-(r:Recipe)
>       WHERE id(i)=5167
>       WITH [i, count(DISTINCT r.id), idB, recAB, recB, tots, time] AS c
>     FOREACH (row IN c |
>       FOREACH (i1 in **c[0] |**
>         FOREACH (recA in c[1] |
>           FOREACH (i2 in c[2]|
>             FOREACH (recAB in c[3] |
>               FOREACH (recB in c[4] |
>                 FOREACH (totalRec in c[5] |
>                   CREATE (i1:Ingredient )-[pm1:PMI]->(i2: Ingredient)
>                   SET startNode(pm1).pmiTime = c[6], endNode(pm1).pmiTime = c[6], pm1.weight = log( (totalRec*recAB) /(recA*recB) ), pm1.pmiTime= c[6]
>                   CREATE (i1:Ingredient )<-[pm2:PMI]-(i2: Ingredient)
>                   SET startNode(pm2).pmiTime = c[6], endNode(pm2).pmiTime = c[6], pm2.weight = log( (totalRec*recAB) /(recA*recB) ), pm2.pmiTime= c[6]
>                 )
>               )
>             )
>           )
>         )
>       )
>     );

这是错误:

SyntaxException: Type mismatch: expected Collection<T> but was Any (line 10, column 25)"      FOREACH (i1 in c[0] |"

这是运行中的类路径:

Neo4j Server is running at pid 4347
NEO4J_HOME:        /var/lib/neo4j
NEO4J_SERVER_PORT: 7474
NEO4J_INSTANCE:    /var/lib/neo4j
JAVA_HOME:
JAVA_OPTS:         -server -XX:+DisableExplicitGC -Dorg.neo4j.server.properties=conf/neo4j-server.properties -Djava.util.logging.config.file=conf/logging.properties -Dlog4j.configuration=file:conf/log4j.properties -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
CLASSPATH:         /var/lib/neo4j/lib/concurrentlinkedhashmap-lru-1.3.1.jar:/var/lib/neo4j/lib/geronimo-jta_1.1_spec-1.1.1.jar:/var/lib/neo4j/lib/lucene-core-3.6.2.jar:/var/lib/neo4j/lib/neo4j-cypher-2.0.0.jar:/var/lib/neo4j/lib/neo4j-cypher-commons-2.0.0.jar:/var/lib/neo4j/lib/neo4j-cypher-compiler-1.9-2.0.0.jar:/var/lib/neo4j/lib/neo4j-cypher-compiler-2.0-2.0.0.jar:/var/lib/neo4j/lib/neo4j-graph-algo-2.0.0.jar:/var/lib/neo4j/lib/neo4j-graph-matching-2.0.0.jar:/var/lib/neo4j/lib/neo4j-jmx-2.0.0.jar:/var/lib/neo4j/lib/neo4j-kernel-2.0.0.jar:/var/lib/neo4j/lib/neo4j-lucene-index-2.0.0.jar:/var/lib/neo4j/lib/neo4j-shell-2.0.0.jar:/var/lib/neo4j/lib/neo4j-udc-2.0.0.jar:/var/lib/neo4j/lib/org.apache.servicemix.bundles.jline-0.9.94_1.jar:/var/lib/neo4j/lib/parboiled-core-1.1.6.jar:/var/lib/neo4j/lib/parboiled-scala_2.10-1.1.6.jar:/var/lib/neo4j/lib/scala-library-2.10.3.jar:/var/lib/neo4j/lib/server-api-2.0.0.jar:/var/lib/neo4j/system/lib/asm-3.1.jar:/var/lib/neo4j/system/lib/bcprov-jdk16-140.jar:/var/lib/neo4j/system/lib/commons-beanutils-1.8.0.jar:/var/lib/neo4j/system/lib/commons-beanutils-core-1.8.0.jar:/var/lib/neo4j/system/lib/commons-collections-3.2.1.jar:/var/lib/neo4j/system/lib/commons-compiler-2.6.1.jar:/var/lib/neo4j/system/lib/commons-configuration-1.6.jar:/var/lib/neo4j/system/lib/commons-digester-1.8.1.jar:/var/lib/neo4j/system/lib/commons-io-1.4.jar:/var/lib/neo4j/system/lib/commons-lang-2.4.jar:/var/lib/neo4j/system/lib/commons-logging-1.1.1.jar:/var/lib/neo4j/system/lib/jackson-core-asl-1.9.7.jar:/var/lib/neo4j/system/lib/jackson-jaxrs-1.9.7.jar:/var/lib/neo4j/system/lib/jackson-mapper-asl-1.9.7.jar:/var/lib/neo4j/system/lib/janino-2.6.1.jar:/var/lib/neo4j/system/lib/javax.servlet-3.0.0.v201112011016.jar:/var/lib/neo4j/system/lib/jcl-over-slf4j-1.6.1.jar:/var/lib/neo4j/system/lib/jersey-core-1.9.jar:/var/lib/neo4j/system/lib/jersey-multipart-1.9.jar:/var/lib/neo4j/system/lib/jersey-server-1.9.jar:/var/lib/neo4j/system/lib/jetty-http-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-io-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-security-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-server-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-servlet-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-util-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-webapp-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-xml-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jsr311-api-1.1.2.r612.jar:/var/lib/neo4j/system/lib/logback-access-1.0.9.jar:/var/lib/neo4j/system/lib/logback-classic-1.0.9.jar:/var/lib/neo4j/system/lib/logback-core-1.0.9.jar:/var/lib/neo4j/system/lib/mimepull-1.6.jar:/var/lib/neo4j/system/lib/neo4j-browser-2.0.0.jar:/var/lib/neo4j/system/lib/neo4j-server-2.0.0.jar:/var/lib/neo4j/system/lib/neo4j-server-2.0.0-static-web.jar:/var/lib/neo4j/system/lib/rhino-1.7R3.jar:/var/lib/neo4j/system/lib/rrd4j-2.0.7.jar:/var/lib/neo4j/system/lib/slf4j-api-1.6.2.jar:/var/lib/neo4j/conf/

这是发生故障的类路径:

Neo4j Server is running at pid 1361
NEO4J_HOME:        /var/lib/neo4j
NEO4J_SERVER_PORT: 7474
NEO4J_INSTANCE:    /var/lib/neo4j
JAVA_HOME:
JAVA_OPTS:         -server -XX:+DisableExplicitGC - Dorg.neo4j.server.properties=conf/neo4j-server.properties -Djava.util.logging.config.file=conf/logging.properties -Dlog4j.configuration=file:conf/log4j.properties -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
CLASSPATH:         /var/lib/neo4j/lib/concurrentlinkedhashmap-lru-1.3.1.jar:/var/lib/neo4j/lib/geronimo-jta_1.1_spec-1.1.1.jar:/var/lib/neo4j/lib/lucene-core-3.6.2.jar:/var/lib/neo4j/lib/neo4j-cypher-2.0.1.jar:/var/lib/neo4j/lib/neo4j-cypher-commons-2.0.1.jar:/var/lib/neo4j/lib/neo4j-cypher-compiler-1.9-2.0.1.jar:/var/lib/neo4j/lib/neo4j-cypher-compiler-2.0-2.0.1.jar:/var/lib/neo4j/lib/neo4j-graph-algo-2.0.1.jar:/var/lib/neo4j/lib/neo4j-graph-matching-2.0.1.jar:/var/lib/neo4j/lib/neo4j-jmx-2.0.1.jar:/var/lib/neo4j/lib/neo4j-kernel-2.0.1.jar:/var/lib/neo4j/lib/neo4j-lucene-index-2.0.1.jar:/var/lib/neo4j/lib/neo4j-shell-2.0.1.jar:/var/lib/neo4j/lib/neo4j-udc-2.0.1.jar:/var/lib/neo4j/lib/org.apache.servicemix.bundles.jline-0.9.94_1.jar:/var/lib/neo4j/lib/parboiled-core-1.1.6.jar:/var/lib/neo4j/lib/parboiled-scala_2.10-1.1.6.jar:/var/lib/neo4j/lib/scala-library-2.10.3.jar:/var/lib/neo4j/lib/server-api-2.0.1.jar:/var/lib/neo4j/system/lib/asm-3.1.jar:/var/lib/neo4j/system/lib/bcprov-jdk16-140.jar:/var/lib/neo4j/system/lib/commons-beanutils-1.8.0.jar:/var/lib/neo4j/system/lib/commons-beanutils-core-1.8.0.jar:/var/lib/neo4j/system/lib/commons-collections-3.2.1.jar:/var/lib/neo4j/system/lib/commons-compiler-2.6.1.jar:/var/lib/neo4j/system/lib/commons-configuration-1.6.jar:/var/lib/neo4j/system/lib/commons-digester-1.8.1.jar:/var/lib/neo4j/system/lib/commons-io-1.4.jar:/var/lib/neo4j/system/lib/commons-lang-2.4.jar:/var/lib/neo4j/system/lib/commons-logging-1.1.1.jar:/var/lib/neo4j/system/lib/jackson-core-asl-1.9.7.jar:/var/lib/neo4j/system/lib/jackson-jaxrs-1.9.7.jar:/var/lib/neo4j/system/lib/jackson-mapper-asl-1.9.7.jar:/var/lib/neo4j/system/lib/janino-2.6.1.jar:/var/lib/neo4j/system/lib/javax.servlet-3.0.0.v201112011016.jar:/var/lib/neo4j/system/lib/jcl-over-slf4j-1.6.1.jar:/var/lib/neo4j/system/lib/jersey-core-1.9.jar:/var/lib/neo4j/system/lib/jersey-multipart-1.9.jar:/var/lib/neo4j/system/lib/jersey-server-1.9.jar:/var/lib/neo4j/system/lib/jetty-http-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-io-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-security-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-server-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-servlet-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-util-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-webapp-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jetty-xml-9.0.5.v20130815.jar:/var/lib/neo4j/system/lib/jsr311-api-1.1.2.r612.jar:/var/lib/neo4j/system/lib/logback-access-1.0.9.jar:/var/lib/neo4j/system/lib/logback-classic-1.0.9.jar:/var/lib/neo4j/system/lib/logback-core-1.0.9.jar:/var/lib/neo4j/system/lib/mimepull-1.6.jar:/var/lib/neo4j/system/lib/neo4j-browser-2.0.1.jar:/var/lib/neo4j/system/lib/neo4j-server-2.0.1.jar:/var/lib/neo4j/system/lib/neo4j-server-2.0.1-static-web.jar:/var/lib/neo4j/system/lib/rhino-1.7R3.jar:/var/lib/neo4j/system/lib/rrd4j-2.0.7.jar:/var/lib/neo4j/system/lib/slf4j-api-1.6.2.jar:/var/lib/neo4j/conf/

关于预期结果的说明: 对于集合中的每一行,查询应该创建 2 个关系:(i1)-[:PMI]-&gt;(i2)(i2)-[:PMI]-&gt;(i1)[:PMI] 关系的权重是 Log() 函数中的数学运算。该图是(:Ingredient)(:Recipe) 节点。此查询将在(i1:Ingredient) 和包含(i1) 的配方中出现的每个(i2:Ingredient) 之间创建关系。这使我能够了解成分配对的概率。

【问题讨论】:

  • 解释查询应该做什么可能会有所帮助。我想你会发现有更简洁的方式来表达你想要的东西,这在 2.0.1 中可以正常工作。
  • 对于集合中的每一行,查询应该创建一个关系:A->B 和 A
  • 这在 2.0.1 中不起作用的原因是它依赖于 2.0.0 中存在的错误,该错误已被修复。在上面的示例中,c 集合是所有不同类型事物的混合,因此 Cypher 将其整体类型输出为“Collection”——这意味着里面的每个事物都只是一个“Any”(最没用的类型) . 2.0.0 中的错误是类型为“Any”的东西实际上几乎在任何地方都被接受(即,Any 的类型检查失败)。
  • 这是一个非常有用的解释。那么,如果我将c 中的列分组到组成节点和整数中,那么我应该能够正确使用它们吗?

标签: neo4j cypher


【解决方案1】:

您能否将您的非收藏品包装在[ ] 中,看看是否能解决问题?例如:FOREACH(i1 IN [c[0]] |

好的,这是对编译的轻微重写的尝试——如果你可以在 console.neo4j.org 上发布一些示例数据,如果它不起作用:

MATCH (total:Recipe)
WITH count(DISTINCT total) AS tots, timestamp() AS time
MATCH (ia:Ingredient)<-[:HAS_INGREDIENT]-(recab:Recipe)-[recHasB:HAS_INGREDIENT]->(ib:Ingredient)
WHERE id(ia)=5167
WITH DISTINCT ib AS idB, count(DISTINCT recab) AS recAB , count(DISTINCT recHasB) AS recB, tots, time
MATCH (i:Ingredient)<-[:HAS_INGREDIENT]-(r:Recipe)
WHERE id(i)=5167
WITH i, count(DISTINCT r.id) as recA, idB as i2, recAB, recB, tots, time  
CREATE (i)-[pm1:PMI {pmiTime:time, weight:log( (tots*recAB) /(recA*recB) )}]->(i2)
CREATE (i)<-[pm2:PMI {pmiTime:time, weight:log( (tots*recAB) /(recA*recB) )}]-(i2)
SET i.pmiTime = time, pm1.pmiTime = time, i2.pmiTime = time, pm2.pmiTime = time

【讨论】:

  • 另外,你为什么要遍历行 IN c,然后使用 c[0] 等?感觉不对。
  • 完全同意,这是一个 hacky 查询。很高兴有一些关于改进其工作方式的方法的意见。我花了几天时间才让它在第一个案例中工作。如何在 2.0.1 中进行这项工作?它仍然适用于我在 2.0.0 上部署和测试的服务器,但它不适用于我尝试使用 2.0.1 构建的新服务器。
  • 另外,是的...我已经根据您的建议包装了所有查询。我现在得到一个不同的错误(指针在 'totalRec' 上): SyntaxException:类型不匹配:预期的 Double 或 Integer 但为 Any(第 17 行,第 102 列)“ SET startNode(pm1).pmiTime = c[6], endNode( pm1).pmiTime = c[6], pm1.weight = log( (totalRecrecAB) /(recArecB) ), pm1.pmiTime= c[6]" 当我遇到差异错误时将 totalRec 替换为 [c[5]]:类型不匹配:预期为 Double 或 Integer,但为 Any(第 17 行,第 105 列)
  • 非常感谢@Wes 的帮助。不过,它并不完全奏效。该查询建立了许多关系,但赋予所有这些关系相同的权重。我将努力为您提供的链接获取一些示例数据。
  • 您能解释一下您的预期结果吗?
猜你喜欢
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 2017-12-24
  • 1970-01-01
相关资源
最近更新 更多