我遇到一个问题,其中有许多节点A,B,C,D
B-->A
C-->B
D-->B
他们之间的关系是孩子。
现在我想查询Neo4j,从标签列表(B,C,D)中找到图形底部存在哪些节点
我正在制作机器人应用程序。在neo4j数据库中,关系将存储在不同的术语之间。
Like :dog-->:animal
:labra-->:dog
:germanShepard-->:dog
现在如果用户要求qustion告诉我关于狗的信息,那么我应该能够获得狗标签数据,如果用户要求告诉我关于拉布拉狗的信息,那么我应该能够获得拉布拉标签数据。我打破了用户输入标记,然后尝试找到底部的标签。
答案 0 :(得分:0)
您可以尝试类似
的内容Match (a:Label) where not (a)<--(:Label) return a
(应该可行,但我没有测试过)
答案 1 :(得分:0)
正如我的评论中所提到的,从长远来看,为每个节点使用唯一标签的成本会很高,并且会影响查询的查找速度。
因此,如果我正确理解您的用例,您就会将用户输入分解为令牌,并且令牌应与图表中同一路径上的节点匹配。您希望在图形的“底部”找到标签,基本上是叶节点,但在您的描述中,子节点指向其父节点。我假设它是:从子节点到父节点的父关系。
这是一个可能做你想要的查询。我们假设您将令牌列表作为参数{tokens}传递。请查看开发人员文档以了解如何使用参数。
UNWIND {tokens} as token
MATCH (n)
WHERE labels(n) = token
AND NOT ()-[:Parent]->(n)
RETURN n
这将确保您返回的节点本身不是任何其他节点的父节点。
但是,如果您希望能够返回节点,即使它们是其他节点的父节点,那么我们也可以返回距离根节点最远的节点。这需要:根节点位于整个图的根部。对于您的描述中的示例,: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
请记住,当有多个节点与:Root的距离相同时,不保证此查询有效。例如,如果将“germanShepard”和“labra”作为标记列表的元素给出,则由于LIMIT 1,将仅返回一个相应的节点,而不保证将返回哪个节点。