当我尝试在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) =
我不明白为什么没有定义市场
答案 0 :(得分:1)
市场未定义为变量,您应该在WITH子句
中传递它"a.b.c".Split(".".ToCharArray(),2);
答案 1 :(得分:1)
您只在WITH子句中使用product
。 marketplace
也应该被用来进一步处理。
修改后的查询
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
变量:产品。您根本不会限制与特定市场合作的产品。
所以让我们解决这个问题。还有许多其他改进:
marketplace
限制在您想要的市场,而不是最终。 product
具有产品Feed。所有这些都使查询更简洁有效。
MATCH (marketplace:`Marketplace`)-[:HAS_PRODUCT]->(product:`Product`)
WHERE id(marketplace) = 123481 AND (product)-[:HAS_PRODUCT_FEED]->(:`ProductFeed`)
RETURN product