neo4j从标签列表中获取,这些标签是一个孩子,哪一个是父母

时间:2017-01-25 07:11:08

标签: neo4j

我遇到一个问题,其中有许多节点A,B,C,D

B-->A
C-->B
D-->B

他们之间的关系是孩子。

现在我想查询Neo4j,从标签列表(B,C,D)中找到图形底部存在哪些节点

我正在制作机器人应用程序。在neo4j数据库中,关系将存储在不同的术语之间。

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

现在如果用户要求qustion告诉我关于狗的信息,那么我应该能够获得狗标签数据,如果用户要求告诉我关于拉布拉狗的信息,那么我应该能够获得拉布拉标签数据。我打破了用户输入标记,然后尝试找到底部的标签。

2 个答案:

答案 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,将仅返回一个相应的节点,而不保证将返回哪个节点。