Neo4j Cypher查询错误

时间:2017-02-07 12:07:11

标签: neo4j cypher

当我尝试在neo4j中执行查询时,我遇到了一个问题。

预期结果是从市场开始获取属于某个市场并与ProductFeed有关的产品

查询

MATCH (marketplace:`Marketplace`), 
(marketplace)-[rel_has_product_products:HAS_PRODUCT]->(products:`Product`),
 (product:`Product`), 
(product)-[rel_has_product_feed_productFeed:HAS_PRODUCT_FEED]->(productFeed:`ProductFeed`) 
WITH product, 
count(productFeed) AS productFeed_count
 WHERE id(marketplace) = 123481 
and productFeed_count >= 1 
RETURN product 

我得到的错误是marketplace not defined (line 1... id(marketplace) =

我不明白为什么没有定义市场

4 个答案:

答案 0 :(得分:1)

市场未定义为变量,您应该在WITH子句

中传递它
"a.b.c".Split(".".ToCharArray(),2);

答案 1 :(得分:1)

您只在WITH子句中使用productmarketplace也应该被用来进一步处理。

修改后的查询

MATCH (marketplace:`Marketplace`), 
(marketplace)-[rel_has_product_products:HAS_PRODUCT]->(products:`Product`),
 (product:`Product`), 
(product)-[rel_has_product_feed_productFeed:HAS_PRODUCT_FEED]->(productFeed:`ProductFeed`) 
WITH product, marketplace,
count(productFeed) AS productFeed_count
 WHERE id(marketplace) = 123481 
and productFeed_count >= 1 
RETURN product 

答案 2 :(得分:1)

这里的问题是您使用WITH子句连接不同的子查询。只有WITH子句中明确声明的变量才会转入下一个子句。

MATCH (marketplace:`Marketplace`) ...
WITH product, count(productFeed) AS productFeed_count
WHERE id(marketplace) = 123481 and productFeed_count >= 1 
RETURN product 

您没有携带marketplace WITH条款。因此,正确的方法是将WHERE条件添加到初始MATCH或将marketplace添加到WITH子句中:

MATCH (marketplace:`Marketplace`), 
    (marketplace)-[rel_has_product_products:HAS_PRODUCT]->(products:`Product`),
    (product:`Product`), 
    (product)-[rel_has_product_feed_productFeed:HAS_PRODUCT_FEED]->(productFeed:`ProductFeed`) 
WHERE id(marketplace) = 123481 
WITH product, count(productFeed) AS productFeed_count
WHERE productFeed_count >= 1 
RETURN product

MATCH (marketplace:`Marketplace`), 
    (marketplace)-[rel_has_product_products:HAS_PRODUCT]->(products:`Product`),
    (product:`Product`), 
    (product)-[rel_has_product_feed_productFeed:HAS_PRODUCT_FEED]->(productFeed:`ProductFeed`) 
WITH marketplace, product, count(productFeed) AS productFeed_count
WHERE id(marketplace) = 123481 AND productFeed_count >= 1 
RETURN product

似乎选项(1)从性能角度来看是更好的方法,因为它在过程的早期消除了不需要的路径(那些没有启动市场的123481)。

答案 3 :(得分:1)

虽然其他人都是正确的,但问题的解决方法是在您的WITH子句中包含marketplace以使其保持在范围内,但是您的查询会出现更严重的问题:'被忽视了。

您有一个从市场到products:Products的匹配项,但您实际上从未在整个查询中再次使用products变量。相反,您可以单独匹配与所有匹配的新product变量:产品。您根本不会限制与特定市场合作的产品。

所以让我们解决这个问题。还有许多其他改进:

  1. 我们还应确保将marketplace限制在您想要的市场,而不是最终。
  2. 我们可以摆脱你不会使用的任何变量,所以让我们抛弃关系变量。
  3. 您似乎只是从产品与其产品Feed匹配,其唯一目的是确保其具有产品Feed。我们可以通过在第一个MATCH上创建WHERE子句的这一部分来更轻松,更快地完成此操作,确保我们匹配的product具有产品Feed。
  4. 所有这些都使查询更简洁有效。

    MATCH (marketplace:`Marketplace`)-[:HAS_PRODUCT]->(product:`Product`)
    WHERE id(marketplace) = 123481 AND (product)-[:HAS_PRODUCT_FEED]->(:`ProductFeed`)
    RETURN product