【问题标题】:using cypher to find nodes in a subgraph that are NOT connected to a specified node使用 cypher 在子图中查找未连接到指定节点的节点
【发布时间】:2014-03-11 06:35:27
【问题描述】:

我正在使用 Neo4j 学习 cypher,但我遇到了一些问题,表明我仍然不太明白。

我正在尝试编写一个查找子图的查询,然后从该子图中排除连接到指定节点的节点。

实际上,这是一个推荐问题:我找到了一组推荐,但想排除目标用户已经知道的那些东西。

我想我可以这样做:

match (u:User{id:"some id"}), (:Category{title:"some category"})-[:categorizes]->(i:Item) 
where not (u)-[:knows_about]-(i) 
return  i

但这不起作用。

谁能解释我做错了什么/我应该做什么?

【问题讨论】:

    标签: neo4j cypher recommendation-engine


    【解决方案1】:

    我认为您想要以下内容:

    MATCH (:Category{title:"some category"})-[:categorizes]->(i:Item)
    MATCH (u:User {id:some_id})
    WHERE  not (u)-[:knows_about]-(i) 
    RETURN i
    

    您可能希望在第二个 WHERE 子句中添加一个方向(性能!)。

    【讨论】:

    • 不,这并没有给出预期的结果。它仍在返回用户“知道”的项目:-(
    • 我收回了这一点,事实证明我需要更好地理解我的数据 :-) 我将上述答案重新组织成一种看起来更易读的形式:MATCH (u:User{id:"some id"}) WITH u MATCH (i:Item)<-[:categorizes]-(:Category{title:"some category"}) WHERE NOT (u)-[:knows_about]->(i) RETURN i
    • 事实上,不需要WITH,看起来我的原始查询工作正常,我只是误解了“正确”结果的样子。
    • 看起来我的性能最好:MATCH (:Category{title:"some category"})-[:categorizes]->(i:Item) MATCH (u:User{id:"some id"}) WHERE NOT (u)-[:konws_about]->(i) RETURN i
    • 更新了我的答案。我不知道您可以引用 {id:some_id} 之类的 id。随意接受。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多