neo4j从标签列表中获取哪个是子标签,哪个是父标签

neo4j从标签列表中获取哪个是子标签,哪个是父标签,neo4j,Neo4j,我有一个问题,其中有许多节点a,B,C,D 在哪里 他们之间的关系是孩子 现在我想查询Neo4j,从标签列表(B,C,D)中找出哪些节点位于图的底部 我正在申请机器人。在neo4j中,数据库关系将存储在不同的术语之间 Like :dog-->:animal :labra-->:dog :germanShepard-->:dog 现在,如果用户问一个问题告诉我关于狗的信息,那么我应该能够获取狗标签数据,如果用户问告诉我关于labra dog的信息,那么我应

我有一个问题,其中有许多节点a,B,C,D 在哪里

他们之间的关系是孩子

现在我想查询Neo4j,从标签列表(B,C,D)中找出哪些节点位于图的底部

我正在申请机器人。在neo4j中,数据库关系将存储在不同的术语之间

Like :dog-->:animal 
     :labra-->:dog
     :germanShepard-->:dog

现在,如果用户问一个问题告诉我关于狗的信息,那么我应该能够获取狗标签数据,如果用户问告诉我关于labra dog的信息,那么我应该能够获取labra标签数据。我正在将用户输入分解为令牌,然后尝试找到底部的标签。

您可以尝试类似的方法

Match (a:Label) where not (a)<--(:Label) return a

Match(a:Label)where not(a)正如我在评论中提到的,从长远来看,为每个节点使用一个唯一的标签将是昂贵的,并且会影响查询的查找速度

因此,如果我正确理解了您的用例,那么您将用户输入分解为令牌,并且令牌应该与图形中相同路径上的节点匹配。您希望在图的“底部”找到标签,基本上是一个叶节点,尽管在您的描述中,子节点指向它们的父节点。我假设从子节点到父节点是:父关系

这里有一个查询,它可能会满足您的要求。我们假设您将令牌列表作为参数{tokens}传递。请查看开发人员文档以了解如何使用参数

UNWIND {tokens} as token
MATCH (n)
WHERE labels(n) = token
AND NOT ()-[:Parent]->(n)
RETURN n
这将确保返回的节点本身不是任何其他节点的父节点

但是,如果您希望能够返回节点,即使它们是其他节点的父节点,那么我们可以返回距离根节点最远的节点。这需要在整个图形的根上有一个:Root节点。例如,在您的描述中,:Root将是:animal的父级

UNWIND {tokens} as token
MATCH (n)
WHERE labels(n) = token
MATCH (n)-[r:Parent*]->(:Root)
RETURN n
ORDER BY SIZE(r)
LIMIT 1

请记住,当有多个节点与:根具有相同的距离时,此查询不能保证工作。例如,如果“germanShepard”和“labra”作为令牌列表的元素给出,则由于限制1,只会返回一个相应的节点,而不保证返回哪个节点。

A、B、C、D是真的,还是仅仅是“标识符”或其他什么?你说的“在图的底部”是什么意思关系是有方向性的,但除此之外,没有其他意义。还有,你已经看过了吗?如果你不熟悉基础知识,通常很难提出好的问题。是的,A、B、C、D是标签名。例如,AIt听起来像是在寻找子关系链的根节点。请使用您迄今为止尝试过的查询更新您的描述。如果您还没有阅读文档,请阅读文档。
UNWIND {tokens} as token
MATCH (n)
WHERE labels(n) = token
MATCH (n)-[r:Parent*]->(:Root)
RETURN n
ORDER BY SIZE(r)
LIMIT 1