cypher查询在可选节点上匹配

时间:2014-01-19 15:18:41

标签: neo4j cypher

我正在尝试改进已发布的查询: neo4j improving cypher query performace

同样,我有items图表数据库。每个item都与多个properties相关联,可以由多个items共享。 但是,这次我想从少数items个节点开始搜索property并查找连接最多的项目。

所以,我有一组属性pr=["pr1","pr2","pr3"],我想找到最相关的items

即。

match (pr)-[r]-(item)
return item, count(r) as matching_properties
order by matching_properties

但是,我也想找到类似的东西。 SIMILAR之间存在properties个关系,我想找到:

MATCH (pr) -[:SIMILAR]->(pr2)-[r]-(item)

我尝试通过执行以下操作检索所有项目:

MATCH (pr) -[r*1..2]-(item)

问题是我只想通过SIMILAR节点获得property关系的路径,不幸的是,我有很多路径通过其他关系的其他节点。 所以我可以做类似的事情:

MATCH (pr) -[r*1..2]-(item)
where (length(r)= 1 or ANY (x in r where (type(x)="SIMILAR"))) 

但这真的没有效率,因为它只是路径的一小部分。 我真的想要做一个类似于此的可选匹配:

MATCH (pr) -[r2?:SIMILAR]->(pr2?)-[r]-(item)
where pr2.type = "property"

或者,在两个路径选项之间使用“OR”操作数(我知道它不存在..)

有没有办法做到这一点? 目前我正在使用neo4j 1.9.2,但我打算转向2.0。 所以2.0的答案对我也有好处。

1 个答案:

答案 0 :(得分:4)

这样的东西?

从0开始的路径(*0..)还包括到起始节点的零长度路径。

MATCH (pr:property)-[:SIMILAR*0..1]->(pr2:property)<-[:HAS_PROPERTY]-(item:item)
RETURN pr2, item