【问题标题】:Neo4j/Cypher - find nodes that link to all given nodes - the right way?Neo4j/Cypher - 找到链接到所有给定节点的节点 - 正确的方式?
【发布时间】:2014-12-23 18:36:19
【问题描述】:

我想过滤链接到所有给定节点的节点。

我已经尝试过这个查询,它返回具有['passionate', 'eye', 'ear'] 之一的每个页面:

MATCH (includeWord:Word) WHERE includeWord.Text IN ['passionate', 'eye', 'ear']
MATCH (p:Page)-[:CONTAINS]->(includeWord:Word)
// WHERE p LINKS TO ALL includeWord AT LEAST ONCE ?
RETURN DISTINCT p

这个查询也没有完成这项工作:

MATCH (p:Page)-[:CONTAINS]->(includeWord:Word)
WHERE includeWord.Text = 'passionate'
AND includeWord.Text = 'eye'
AND includeWord.Text = 'ear'
RETURN DISTINCT p

从编程上讲,这有点丑陋和不安全,我相信你们中的一些人知道更好的答案。

也许像

MATCH (p:Page)-[:CONTAINS]->(includeWord:Word)
WHERE includeWord.Text IN_ALL ['passionate', 'eye', 'ear']
RETURN DISTINCT p

?

谢谢!

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    哎呀,

    我发现了这个问题neo4j cypher - how to find all nodes that have a relationship to list of nodes

    对于我的查询来说,它工作得很好。

    看起来像这样:

    MATCH (p:Page)-[:CONTAINS]->(word:Word)
    WITH p, collect(word.Text) as words
    WHERE ALL (v IN ['passionate', 'eye', 'ear'] WHERE v IN words)
    RETURN p
    

    理解之前需要阅读一下!

    【讨论】:

      【解决方案2】:

      实际上我有点惊讶第二个查询有效。据我了解,密码中的MATCH 一次只考虑一个子图,因此这意味着任何给定的:Word 都不可能在同时。我希望您需要执行以下操作:

      MATCH
        (p:Page),
        p-[:CONTAINS]->(word1:Word),
        p-[:CONTAINS]->(word2:Word),
        p-[:CONTAINS]->(word3:Word)
      WHERE
        word1.Text = 'passionate',
        word2.Text = 'eye',
        word3.Text = 'ear'
      RETURN p
      

      显然,这是一个更复杂的查询,但...

      【讨论】:

      • 下边第二个不工作!让我纠正一下! (谢谢)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 2017-12-11
      相关资源
      最近更新 更多