Cypher关系+路径和lucene

时间:2015-03-20 14:06:49

标签: neo4j cypher

这里的问题是我使用路径(p =)来选择路径中的各种关系,我认为让它们从一个共同保留的前期开始(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毫秒。开始认为在构建查询时动态添加所有关系类型可能是唯一的解决方案。

1 个答案:

答案 0 :(得分:2)

你需要做这样的事情......

...
where ANY(r in relationships(p) where type(r)=~ 'has_.*' OR type(r) = 'extends')
...

但是为什么你需要这样做,因为你的路径关系已经只包含与所需where子句中的术语匹配的关系类型。