【问题标题】:Cypher Query where target reverse matches all relationship requirements目标反向匹配所有关系要求的 Cypher 查询
【发布时间】:2018-06-22 16:31:36
【问题描述】:

我正在使用 Neo4j 社区 3.4.1。

我有一个看起来像这样的图表: Data Model Graph

绿色节点是列表。

顶部列表是列表一,底部列表是列表二

顶部是壁炉,底部是停车场

我正在寻找一个 Cypher 查询,该查询从特定列表开始,并找到满足该 SavedSearch 的所有条件的所有 SavedSearches。

例如,Listing Two 将满足上述SavedSearch,因为它与 SavedSearch 的两个条件都有关系。

但是,Listing One 不符合条件,因为该列表仅满足 SavedSearches 条件之一。

我有以下查询,它从列表开始并匹配任何具有直接路径的已保存搜索,但搜索不会检查已保存搜索中的所有路径是否都连接回来。因此,以下查询将返回清单一和清单二的 SavedSearch:

MATCH (l:Listing {list_id: 'one'})
MATCH (l)-[:ATTRIBUTE]
      ->(:Value {field: 'features', value: 'Fireplace'})
      <-[:CONDITION]
      -(s:SavedSearch)
RETURN s

有没有办法匹配 SavedSearch,然后追溯搜索路径以查看是否所有 CONDITION 路径都返回到同一个列表?

我想将其作为直接的 Cypher 查询来执行,但如果这样做更容易且效率更高,我愿意执行自定义过程并使用 Java API。

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    您可以使用collect()all() 函数尝试此解决方案:

    match (:Listing {list_id :'one'})-[:ATTRIBUTE]->(attr:Value {field: 'features', value: 'Fireplace'})
    with collect(attr) as attrs
    match (s:SavedSearch)
    where all (attr in attrs where (s)-[:CONDITION]->(attr))
    return s
    

    我将所有属性存储到一个名为attrs 的集合中。然后匹配所有连接到每个attrSavedSearches。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多