我们正在为Neo4j进行POC。用例是一个仪表板,我们只为卖方提供他们有资格并且尚未采取行动的机会。目前有3个标准,我们正在寻找另外两个标准。相应的SQL是3页,所以我们正在寻找一种更好的方法,因为当我们添加下一个标准时,Neo中的2个节点路径将成为SQL中的一个熊。当我运行下面的查询时,我得到的返回行数与SQL不同。返回的购买必须在所有3条路径的末尾,而不是在第4条路径中。我希望你能指出我哪里出错了。如果这是一个很好的查询,那么我有数据问题。
以下是查询:
//oportunities dashboard
MATCH (s:SellerRep)-[:SELLS]->(subCat:ProductSubCategory)<-[:IS_FOR_SUBCAT]-(b:Buy)
MATCH (s:SellerRep)-[:SELLS_FOR]->(o:SellerOrg)-[:HAS_SELLER_TYPE]->(st:SellerType)<-[:IS_FOR_ST]-(b:Buy)
MATCH (s:SellerRep)-[:SELLS_FOR]->(o:SellerOrg)-[:IS_IN_SC]->(sc:SellerCommunity)<-[:IS_FOR_SC]-(b:Buy)
WHERE NOT (s:SellerRep)-[:PLACED_BID]->(:Bid)-[:IS_FOR_BUY]->(b:Buy)
AND s.sellerRepId = 217722 and b.currBuyStatus = 'Open'
RETURN b.buyNumber, b.buyDesc, st.sellerType, sc.communtiyName, subCat.subCategoryName+' - '+subCat.desc as sub_cat
如果有帮助,这是数据模型: POC Data model
感谢您的帮助。
答案 0 :(得分:1)
WHERE
子句仅过滤前一个MATCH
子句。
由于您在第三个WHERE
子句之后放置了MATCH
子句,因此前两个MATCH
子句未绑定到特定的SellerRep
或Buy
节点,因此会带来比您预期的更多ProductSubCategory
和SellerType
个节点。
以下查询可能更符合您的预期:
MATCH (s:SellerRep)-[:SELLS]->(subCat:ProductSubCategory)<-[:IS_FOR_SUBCAT]-(b:Buy)
WHERE s.sellerRepId = 217722 AND b.currBuyStatus = 'Open' AND NOT (s:SellerRep)-[:PLACED_BID]->(:Bid)-[:IS_FOR_BUY]->(b:Buy)
MATCH (s)-[:SELLS_FOR]->(o:SellerOrg)-[:HAS_SELLER_TYPE]->(st:SellerType)<-[:IS_FOR_ST]-(b)
MATCH (o)-[:IS_IN_SC]->(sc:SellerCommunity)<-[:IS_FOR_SC]-(b)
RETURN b.buyNumber, b.buyDesc, st.sellerType, sc.communtiyName, subCat.subCategoryName+' - '+subCat.desc as sub_cat
注意:您的第二个和第三个MATCH
条款均以(s:SellerRep)-[:SELLS_FOR]->(o:SellerOrg)
开头。通过让我的第三个MATCH
子句以(o)
开头,我简化了相同的逻辑。希望您实际上打算强制两个子句引用相同的SellerOrg
节点。