我想查询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条款?
谢谢!
答案 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