Cypher查询与不同的路径

时间:2013-07-04 16:03:09

标签: neo4j cypher graph-databases

我想查询Neo4J数据库中的以下子图:

(a)-->(b)-->(c)-->(d)
       |
       | -->(e)

注意:a,b,c,d,e是每个节点的属性值(非唯一值)。这些节点有数千个具有相似属性值(a到e),但它们是随机连接的。

如何编写Cyper查询以专门找到特定的子图(类似于子图同构问题)我寻找并返回(a)?我尝试了以下Cyper查询,但弹出其他子图:

START n1=node:SomeIndex(AttrVal="a")
MATCH n1-[]->n2-[]->n3-[]->n4
WHERE n2.AttrVal="b" AND n3.AttrVal="c" and n4.AttrVal="d"
WITH  n1, n2
MATCH n2-[]->n5
WHERE n5.AttrVal="e"
RETURN n1

我是否错误地使用了WITH和第二个MATCH条款?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用逗号在单个匹配子句中组合多个路径:

START n1=node:SomeIndex(AttrVal="a")
MATCH n1-[]->n2-[]->n3-[]->n4, n2-[]->n5
WHERE n2.AttrVal="b" AND n3.AttrVal="c" and n4.AttrVal="d" and n5.attrVal='e'
RETURN n1

旁注1:  你也可以像这样重构语句:

START n1=node:SomeIndex(AttrVal="a"), n2=node:SomeIndex(AttrVal="b")
n3=node:SomeIndex(AttrVal="c"), n4=node:SomeIndex(AttrVal="d"),
n5=node:SomeIndex(AttrVal="e")
MATCH n1-[]->n2-[]->n3-[]->n4, n2-[]->n5
RETURN n1

根据图表的结构,第二个可能会更快。

旁注2:n1-[]->n2中的任意关系类型匹配时,您可以使用更短且更易读的符号:n1-->n2