neo4j cypher查询过滤路径

时间:2017-12-19 13:35:33

标签: neo4j cypher

我正在使用neo4j来存储具有2个标签之一的节点的数据:PersonOrganization。所有节点都有一个属性:name

所有关系都标记为LinkedTo并且具有属性:score。一对PersonOrganization节点之间可能存在多个关系

我使用路径查询来搜索这些节点之间的路径,如:

MATCH (n:Person) WHERE n.name =~ "(?i)person1"
MATCH (m:Organization) WHERE m.name =~ "(?i)organization1"
WITH m,n
MATCH p = (m)-[*1..4]-(n)
RETURN p ORDER BY length(p) LIMIT 10

返回所有路径(最多10个)

现在我想找到具体的路径,所有涉及的关系都有score=1。不确定如何实现这一点,我从MATCH p = (m)-[f*1..4]-(n)开始,但它得到了弃用警告。所以经过一些谷歌搜索,试验和错误后,我想出了这个:

MATCH (n:Person) WHERE n.name =~ "(?i)person1"
MATCH (m:Organization) WHERE m.name =~ "(?i)organization1"
WITH m,n
MATCH p = (m)-[*1..4]-(n)
WITH filter(x IN relationships(p) WHERE x.score=1) AS f
ORDER BY length(p)
UNWIND f AS ff
MATCH (a)-[ff]-(b)
RETURN a,b,ff LIMIT 10

但这不正确且不干净,并且给了我路径中不需要的关系和节点。

这可能是一个基本的密码查询,但我只是一个初学者,需要帮助。 :)

1 个答案:

答案 0 :(得分:1)

根据我的理解,您正在搜索此查询:

MATCH p = (m:Organization)-[rels*1..4]-(n:Person) 
WHERE 
    n.name =~ "(?i)person1" AND
    m.name =~ "(?i)organization1" AND
    all(r IN rels WHERE r.score=1)
RETURN p
ORDER BY length(p)

由于all(r IN rels WHERE r.score=1),Neo4j只会在属性score设置为1的路径中展开关系。

另外,您应该注意到您正在为节点n使用正则表达式条件。 m,此运算符无法使用索引! 如果您的目标是进行不区分大小写的搜索,我建议您创建一个清理字段(ex _name)以将名称存储为小写,并用CONTAINS替换正则表达式或STARTS WITH