【问题标题】:Neo4j cypher query to list all nodes in sequence in a unidirectional path matching a certain labelNeo4j 密码查询以在匹配某个标签的单向路径中按顺序列出所有节点
【发布时间】:2013-11-28 09:13:07
【问题描述】:

我的图是一棵有向树,树上的每个分支都有每个节点的唯一标签。例如,分支 1 中的所有节点都有标签:branch 1,分支 2 中的所有节点都有标签:'branch 2'。根节点(节点 0)有两个标签:branch 1:branch 2

什么是 CYPHER 查询来列出 branch 1 中的所有节点 ID,从根节点 依次 到最后一个节点(使用标签:'branch 1' 查找匹配节点)。即,对于列出的每个节点,它和之前的节点也必须有标签'branch 1`。

【问题讨论】:

  • 一个分支的节点之间有什么关系?如果每个分支都有一个唯一标签,则可以使用该标签获取分支的所有节点,但除非您有关系,否则分支不是任何顺序,也不是路径(也不是分支,它是一堆叶子放在标有“分支 x”的袋子里)。

标签: neo4j cypher


【解决方案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]-&gt;(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 中节点上的标签,等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多