2013-07-04 89 views
0

我想在我的Neo4j数据库查询以下子:与分支路径的Cypher查询

(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和2nd MATCH子句时出错?

谢谢!

+0

你能在自然语言描述你的查询应该真的?你的cypher语句不适合ascii艺术图,因为你在Cypher中匹配n1 - > n5,但b以ascii连接到e。 –

+0

Stefan - 更新了代码示例以正确匹配ASCII图形。我本质上是试图在这里完成子图匹配,在数据库中充满了具有各种属性值的所有这些节点。 –

回答

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