Cypher 关系 + 路径和 lucene
Cypher relationships + paths and lucene
这里的问题是我正在使用路径 (p=) 来 select 沿着路径的各种关系,我想通过让它们从一个共同的预留术语开始 (has_..)我可以在 WHERE 子句中使用 Neo4j 的 lucene 语法做出假设,但是当使用路径 (p=) 时,我们返回一个集合,从而使 WHERE 无法定义 MATCH 中的内容。也许还有其他选择?
MATCH (se:SourceExtended {name: 'BASE_NODE'})
WITH se
MATCH p =(:Trim)-[r:has_publication|has_model|has_trim|has_dealer|extends*1..5]-(se)
//WHERE type(r)=~ 'has_.*' OR type(r) = 'extends' <-Fails because p is a collection!!!
WITH se, p LIMIT 1
RETURN extract(n in nodes(p) | labels(n)) as labels, extract(r in relationships(p) | r) as relationships
更新:根据 Dave Bennett 的建议,我可以这样做:
MATCH (se:SourceExtended {source: 'XPRIMA_SPEC'})
WITH se
MATCH p =(:Brand)-[r*1..5]-(se)
WHERE ANY(r in relationships(p) WHERE type(r)=~ 'has_.*' OR type(r) = 'extends')
WITH se, p LIMIT 1
RETURN extract(n in nodes(p) | labels(n)) as labels, extract(r in relationships(p) | r) as relationships
但是令我惊讶的是,查询现在已经从 ~500 毫秒增加到 ~3200 毫秒。开始认为在构建查询时动态添加所有关系类型可能是唯一的解决方案。
你需要做这样的事情...
...
WHERE ANY(r in relationships(p) WHERE type(r)=~ 'has_.*' OR type(r) = 'extends')
...
但是您为什么需要这样做,因为您的路径关系已经只包含与所需 where 子句中的条款匹配的关系类型。
这里的问题是我正在使用路径 (p=) 来 select 沿着路径的各种关系,我想通过让它们从一个共同的预留术语开始 (has_..)我可以在 WHERE 子句中使用 Neo4j 的 lucene 语法做出假设,但是当使用路径 (p=) 时,我们返回一个集合,从而使 WHERE 无法定义 MATCH 中的内容。也许还有其他选择?
MATCH (se:SourceExtended {name: 'BASE_NODE'})
WITH se
MATCH p =(:Trim)-[r:has_publication|has_model|has_trim|has_dealer|extends*1..5]-(se)
//WHERE type(r)=~ 'has_.*' OR type(r) = 'extends' <-Fails because p is a collection!!!
WITH se, p LIMIT 1
RETURN extract(n in nodes(p) | labels(n)) as labels, extract(r in relationships(p) | r) as relationships
更新:根据 Dave Bennett 的建议,我可以这样做:
MATCH (se:SourceExtended {source: 'XPRIMA_SPEC'})
WITH se
MATCH p =(:Brand)-[r*1..5]-(se)
WHERE ANY(r in relationships(p) WHERE type(r)=~ 'has_.*' OR type(r) = 'extends')
WITH se, p LIMIT 1
RETURN extract(n in nodes(p) | labels(n)) as labels, extract(r in relationships(p) | r) as relationships
但是令我惊讶的是,查询现在已经从 ~500 毫秒增加到 ~3200 毫秒。开始认为在构建查询时动态添加所有关系类型可能是唯一的解决方案。
你需要做这样的事情...
...
WHERE ANY(r in relationships(p) WHERE type(r)=~ 'has_.*' OR type(r) = 'extends')
...
但是您为什么需要这样做,因为您的路径关系已经只包含与所需 where 子句中的条款匹配的关系类型。