密码查询,其中目标反向匹配所有关系要求

时间:2018-06-22 16:31:37

标签: neo4j cypher graph-databases

我正在使用Neo4j社区3.4.1。

我有一个图,看起来像: Data Model Graph

绿色节点是列表。

顶部列出的是列出一个,底部列出的是列出两个

顶部功能是壁炉,底部功能是停车

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

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

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

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

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

是否有一种方法可以匹配SavedSearch,然后追溯搜索路径,以查看所有CONDITION路径是否都返回相同的列表?

我希望将其作为直接的Cypher Query进行,但是如果这样做更容易且效率更高,我愿意做一个自定义过程并使用Java API。

1 个答案:

答案 0 :(得分:0)

您可以使用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的集合中。然后匹配连接到每个SavedSearch的所有attr