Neo4j Cypher关系+路径和lucene

Neo4j Cypher关系+路径和lucene,neo4j,cypher,Neo4j,Cypher,这里的问题是,我使用路径p=来选择一条路径上的各种关系,我认为通过让它们以一个公共保留的前置项开始,就可以了。。我可以在WHERE子句中使用Neo4j的lucene语法进行假设,但是,当使用路径p=we时,会返回一个集合,从而使WHERE无法定义匹配中的内容。也许还有其他选择 MATCH (se:SourceExtended {name: 'BASE_NODE'}) WITH se MATCH p =(:Trim)-[r:has_publication|has_model|has_trim|ha

这里的问题是,我使用路径p=来选择一条路径上的各种关系,我认为通过让它们以一个公共保留的前置项开始,就可以了。。我可以在WHERE子句中使用Neo4j的lucene语法进行假设,但是,当使用路径p=we时,会返回一个集合,从而使WHERE无法定义匹配中的内容。也许还有其他选择

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

然而,我很惊讶查询现在已经从~500毫秒增加到~3200毫秒。我开始认为在构建查询时动态添加所有关系类型可能是唯一的解决方案。

您需要这样做

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

但是既然您的路径关系已经只包含与所需where子句中的条件匹配的关系类型,那么为什么需要这样做呢

我应该提到的是,随着时间的推移,越来越多的人际关系会随着时间的推移而增加。。。我不想每次都修改代码。这家公司有。。。如果你愿意,我会保留的。也许更好的设计是简单地将它们定义为具有关系并添加属性,目前还不确定,但感谢您的回答,我会尝试一下。我认为您所做的本质上是更昂贵的。将类型保留在路径中可能会匹配较少的内容。通过匹配所有类型并在where子句中过滤它们,您可能会匹配更多的路径,然后必须过滤它们。通过在neo4j shell中使用概要文件,您将能够获得一些见解。
...
WHERE ANY(r in relationships(p) WHERE type(r)=~ 'has_.*' OR type(r) = 'extends')
...