我有一个问题,其中有许多节点A,B,C,D,其中
B-->A
C-->B
D-->B他们之间的关系就是孩子。
现在,我想查询Neo4j以从标签列表(B、C、D)中找出哪些节点存在于图的底部
我正在做一个机器人应用程序。在neo4j数据库中,关系将存储在不同的术语之间。
Like :dog-->:animal
:labra-->:dog
:germanShepard-->:dog现在,如果用户问一个问题,告诉我关于狗的信息,那么我应该能够获得狗的标签数据,如果用户问告诉我关于labra狗的问题,那么我应该能够获得labra标签数据。我将用户输入的数据分解为标记,然后尝试找到底部的标签。
发布于 2017-01-25 17:25:06
你可以尝试像这样的东西
Match (a:Label) where not (a)<--(:Label) return a(应该可以工作,但我没有测试它)
发布于 2017-01-25 18:40:26
正如我在评论中提到的,从长远来看,为每个节点使用唯一的标签将是昂贵的,并将影响您在查询中的查找速度。
因此,如果我正确理解了您的用例,您将用户输入分解为令牌,并且这些令牌应该与图中相同路径上的节点相匹配。您希望在图的“底部”找到标签,基本上是一个叶节点,尽管在您的描述中,子节点指向它们的父节点。我假设从子节点到父节点的关系是:Parent关系。
这里有一个查询,它可能会执行您想要的操作。我们假设您将令牌列表作为参数{ 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请记住,当有多个节点与:Root的距离相同时,不能保证此查询能够正常工作。例如,如果给定"germanShepard“和"labra”作为令牌列表的元素,则由于限制为1,因此只返回相应节点中的一个,而不能保证返回哪个节点。
https://stackoverflow.com/questions/41845489
复制相似问题