neo4j cypher查询过滤路径

问题描述 投票:1回答:1

我使用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

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

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

neo4j cypher
1个回答
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

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

© www.soinside.com 2019 - 2024. All rights reserved.