用于建模传递闭包的 Neo4j 查询
Neo4j query for modeling transitive clousure
我正在探索 GraphDB 查询语言,并在 OriendDB here 中询问了有关传递闭包支持的问题?我想看看 Neo4J 是如何支持这个特性的:
简单地说,假设我有所有标记为 PERSON 的节点。我有称为 "father" 的边将这些人连接在一起。对于给定的节点 p1,我想知道以下查询在 Neo4j 中的样子:
find all the ancestors of p1?
我不熟悉 Neo4j 语法(但我认为可以定义我在上面解释的这种结构),所以请原谅我跳过模式定义。
这就是您如何找到名为 "Fred Flintstone" 的 PERSON
的所有祖先的方法:
MATCH (p1:PERSON {name: "Fred Flintstone"})-[:father*]->(f)
RETURN f;
这就是找到他所有后代的方法:
MATCH (p1:PERSON {name: "Fred Flintstone"})<-[:father*]-(d)
RETURN d;
您可以更进一步,为祖先创建一个排序:
MATCH (n:Person{RN:1})
match p=n-[:father|mother*..99]->x
return x.RN as RN,x.fullname as Name,length(p) as generation,reduce(srt2 ='', q IN nodes(p)| srt2 + replace(replace(q.sex,'M','A'),'F','B')) AS sortOrder
order by sortOrder
这是为家谱应用程序开发的,所以它有母亲和父亲。在这种情况下,父亲在 (A) 母亲 (B) 之前排序。如果您只是在寻找行尾(union_id=1 表示没有 parents):
MATCH (n:Person{RN:1})
match p=n-[:father|mother*..99]->x
where x.union_id=1
return x.RN as RN,x.fullname as Name,length(p) as generation,reduce(srt2 ='', q IN nodes(p)| srt2 + replace(replace(q.sex,'M','A'),'F','B')) AS sortOrder,x.union_id
我正在探索 GraphDB 查询语言,并在 OriendDB here 中询问了有关传递闭包支持的问题?我想看看 Neo4J 是如何支持这个特性的:
简单地说,假设我有所有标记为 PERSON 的节点。我有称为 "father" 的边将这些人连接在一起。对于给定的节点 p1,我想知道以下查询在 Neo4j 中的样子:
find all the ancestors of p1?
我不熟悉 Neo4j 语法(但我认为可以定义我在上面解释的这种结构),所以请原谅我跳过模式定义。
这就是您如何找到名为 "Fred Flintstone" 的 PERSON
的所有祖先的方法:
MATCH (p1:PERSON {name: "Fred Flintstone"})-[:father*]->(f)
RETURN f;
这就是找到他所有后代的方法:
MATCH (p1:PERSON {name: "Fred Flintstone"})<-[:father*]-(d)
RETURN d;
您可以更进一步,为祖先创建一个排序:
MATCH (n:Person{RN:1}) match p=n-[:father|mother*..99]->x return x.RN as RN,x.fullname as Name,length(p) as generation,reduce(srt2 ='', q IN nodes(p)| srt2 + replace(replace(q.sex,'M','A'),'F','B')) AS sortOrder order by sortOrder
这是为家谱应用程序开发的,所以它有母亲和父亲。在这种情况下,父亲在 (A) 母亲 (B) 之前排序。如果您只是在寻找行尾(union_id=1 表示没有 parents):
MATCH (n:Person{RN:1}) match p=n-[:father|mother*..99]->x where x.union_id=1 return x.RN as RN,x.fullname as Name,length(p) as generation,reduce(srt2 ='', q IN nodes(p)| srt2 + replace(replace(q.sex,'M','A'),'F','B')) AS sortOrder,x.union_id