Neo4j新手在这里,但随着查询变得更加雄心勃勃。我试图检索那些没有产品N的客户C2,但是拥有在产品组N2中找到的产品,这些产品也属于拥有产品N的客户C集。我非常接近这个查询排序和思考这是它(鉴于SKU 123456
标识的产品):
Start
N=node:node_auto_index(sku="123456")
match
(C)-[:owns]->(N),
(C)-[:owns]->(N2),
(book)-[:owned_by]->(C2)
WHERE NOT((C2)-[:owns]->(N))
return C2.name
limit 10
我是否能以理智的方式解决这个问题?奇怪的是它在结果集受限时立即返回(在示例中限制为10),但是当删除限制时,我收到可怕的"未知错误" Web控制台中的错误(查看日志没有任何结果)。
洞察力赞赏!
修改
迈克尔·亨格当然有所帮助,所以我会接受他的回答,但这个问题不是由于一个错字;我介绍了在进行语法替换以匹配我的问题描述中的符号时,因为我担心我的解释有点复杂。然而,解决方案可能会绊倒别人,所以我在这里解释一下。我使用Neo4j网络浏览器对Cypher查询进行原型设计,这种方法运行得相当不错,但由于某些原因,它不允许包含超过1,000条记录的响应。这就是为什么查询在限制它时立即返回响应的原因。当我随后将查询限制超过1,000行时,我被告知响应太大(超过1,000行)。当我完全删除限制时,我会收到"未知错误"错误,我认为只是浏览器管理员指出(不可否认地以令人困惑的方式)它不能返回超过1,000行的响应的方式;为什么在没有使用限制时报告的方式不同我不确定。我通过在Neo4j shell中运行查询得出了这个结论,在那里它愉快地立即返回超过1,000行。希望这有助于某人。
答案 0 :(得分:2)
您的查询中只有一个拼写错误:book
而不是N2
,我还会选择更好的名称。如果你使用2.0开始使用标签。
Start
N=node:node_auto_index(sku="123456")
match
(C)-[:owns]->(N),
(C)-[:owns]->(N2),
(N2)-[:owns]->(C2)
WHERE NOT((C2)-[:owns]->(N))
return C2.name
limit 10
for Neo4j 2.0
match (product:Product {sku:"123456"})<-[:OWNS]-(peer:Customer)
-[:OWNS]->(other:Product)<-[:OWNS]-(target:Customer)
WHERE NOT( (target)-[:owns]->(product))
return target.name
limit 10
也许您可以创建GraphGist数据模型和一些示例查询以供进一步讨论。