我的图是一棵有向树,树上的每个分支对每个节点都有唯一的标签。例如,分支1中的所有节点都有标签:branch 1
,分支2中的所有节点都有标签:“分支2”。根节点(节点0)有两个标签:branch 1
:branch 2
Neo4j密码查询按顺序列出与某个标签匹配的单向路径中的所有节点
什么是CYPHER查询列出branch 1
的所有节点ID从根节点顺序开始到最后一个节点(使用标签:”分支1'找到匹配的节点)。也就是说,对于列出的每个节点,它和之前的节点也必须具有标签“分支1”。
我的图是一棵有向树,树上的每个分支对每个节点都有唯一的标签。例如,分支1中的所有节点都有标签:branch 1
,分支2中的所有节点都有标签:“分支2”。根节点(节点0)有两个标签:branch 1
:branch 2
Neo4j密码查询按顺序列出与某个标签匹配的单向路径中的所有节点
什么是CYPHER查询列出branch 1
的所有节点ID从根节点顺序开始到最后一个节点(使用标签:”分支1'找到匹配的节点)。也就是说,对于列出的每个节点,它和之前的节点也必须具有标签“分支1”。
如果我理解你的话,你实际上并没有在你的节点上使用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
共享样本数据是任意的,它设置为任何你想要的,但通常设置一些限制是一个好主意。)
谢谢你的回应。实际上,节点有标签,而不是关系。所以'分支1'是分支1中的节点上的标签等。 – user3045118
你在分支节点之间有什么关系?如果每个分支都有一个唯一的标签,那么可以使用该标签获取分支的所有节点,但除非有关系,否则分支不是任何顺序,也不是一条路径(也不是一个分支,对于这个问题,它是一堆留在标有“分支x”的袋子里)。 – jjaderberg