在Neo4j中查找位于所有路径末端而不是另一个路径中的节点

时间:2017-10-16 22:53:58

标签: neo4j cypher

我们正在为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

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

WHERE子句仅过滤前一个MATCH子句。

由于您在第三个WHERE子句之后放置了MATCH子句,因此前两个MATCH子句未绑定到特定的SellerRepBuy节点,因此会带来比您预期的更多ProductSubCategorySellerType个节点。

以下查询可能更符合您的预期:

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节点。