2013-11-28 34 views
0

我的图是一棵有向树,树上的每个分支对每个节点都有唯一的标签。例如,分支1中的所有节点都有标签:branch 1,分支2中的所有节点都有标签:“分支2”。根节点(节点0)有两个标签:branch 1branch 2Neo4j密码查询按顺序列出与某个标签匹配的单向路径中的所有节点

什么是CYPHER查询列出branch 1的所有节点ID从根节点顺序开始到最后一个节点(使用标签:”分支1'找到匹配的节点)。也就是说,对于列出的每个节点,它和之前的节点也必须具有标签“分支1”。

+0

你在分支节点之间有什么关系?如果每个分支都有一个唯一的标签,那么可以使用该标签获取分支的所有节点,但除非有关系,否则分支不是任何顺序,也不是一条路径(也不是一个分支,对于这个问题,它是一堆留在标有“分支x”的袋子里)。 – jjaderberg

回答

0

如果我理解你的话,你实际上并没有在你的节点上使用Neo4j 2.0 :Label标签,而是在你的关系上有一个名为label的属性?如果是一般的查询可以是这样的

START root=node(0) 
MATCH path=root<-[rels:IS_BEFORE*1..100]-leaf 
WHERE ALL(rel in rels WHERE rel.label = "branch 1") 
RETURN EXTRACT(n in nodes(path) | ID(n)) as nodeIdSequence 

这可能不是非常有效,因为它匹配所有的分支,只限制了结果的相关分支之后。通过关系类型来识别分支会更有效,例如(root)-[:NEXT_ON_BRANCH_1]->(branchNode)。或者,您可以分两步进行匹配:1)匹配每个分支上的第一个节点并找到正确的分支。 2)现在你知道你有正确的分支,匹配其余的。你可以尝试像

START root=node(0) 
MATCH root<-[r:IS_BEFORE]-branch 
WHERE r.label = "branch 1" 
WITH branch 
MATCH path=branch<-[:IS_BEFORE*1..100]-leaf 
RETURN EXTRACT(n in nodes(path) | ID(n)) as nodeIdSequence 

如果这是你的模型看起来不怎样的,请在http://console.neo4j.org

(深度限额以上*1..100共享样本数据是任意的,它设置为任何你想要的,但通常设置一些限制是一个好主意。)

+0

谢谢你的回应。实际上,节点有标签,而不是关系。所以'分支1'是分支1中的节点上的标签等。 – user3045118

相关问题