neo4j - neo4j:直到结束才遵循关系
问题描述
我正在尝试用 neo4j 表示网络配置。这是我迄今为止一直在使用的 Cyper 脚本:
CREATE (router1:Router {name:'router1', defaultgw:'192.168.123.1'})
CREATE (router2:Router {name:'router2', defaultgw:'172.31.39.1'})
CREATE (gateway1:Gateway {name:'gateway1', ip:'192.168.123.1' })
CREATE (network1:Network {name:'network1', cidr:'192.168.123.0/24'})
CREATE (network2:Network {name:'network2', cidr:'10.23.47.0/24'})
CREATE (network3:Network {name:'network3', cidr:'172.31.39.0/24'})
CREATE (server10:Server {hostname:'server10', ip:'172.31.39.10'})
CREATE (server1:Server {hostname:'server1', ip:'192.168.123.7'})
CREATE (server2:Server {hostname:'server2', ip:'192.168.123.9'})
CREATE (server3:Server {hostname:'server3', ip:'192.168.123.10', ip:'10.23.47.7'})
CREATE (server4:Server {hostname:'server4', ip:'192.168.123.13'})
CREATE (server5:Server {hostname:'server5', ip:'192.168.123.23'})
CREATE (server6:Server {hostname:'server6', ip:'192.168.123.15', ip:'10.23.47.17'})
CREATE
(gateway1)-[:CONNECTED_TO {}]->(router1),
(router2)-[:CONNECTED_TO {}]->(network3),
(router1)-[:CONNECTED_TO {}]->(network1),
(router1)-[:CONNECTED_TO {}]->(network2),
(router1)-[:CONNECTED_TO {}]->(router2),
(network1)-[:CONNECTED_TO {}]->(server1),
(network1)-[:CONNECTED_TO {}]->(server2),
(network1)-[:CONNECTED_TO {}]->(server3),
(network2)-[:CONNECTED_TO {}]->(server3),
(network1)-[:CONNECTED_TO {}]->(server4),
(network1)-[:CONNECTED_TO {}]->(server5),
(network1)-[:CONNECTED_TO {}]->(server6),
(network2)-[:CONNECTED_TO {}]->(server6),
(network3)-[:CONNECTED_TO {}]->(server10)
WITH gateway1 AS g
MATCH (g)-[:CONNECTED_TO]->(r)-[:CONNECTED_TO]->(n)-[:CONNECTED_TO]->(s) RETURN g,r,n,s
;
但是,该MATCH
案例直到第三网络的服务器才让渲染流程!
我的请求有什么问题,如何改进?是否有其他方法可以提出此请求,即表示每个节点是否与另一个节点有关系,而不是仅与单个(此处gateway1
)原点相关的节点?
非常感谢!
解决方案
如果您要求查询以获取以 为根的子树中的所有节点gateway1
,那么您将MATCH
不起作用,因为它仅匹配具有 3 个CONNECTED_TO
关系的路径。到的路径server10
需要 4 个跃点。
要返回具有 1 个或多个以CONNECTED_TO
为根的关系的完整路径gateway1
,这应该有效(该WHERE
子句过滤掉x
非叶节点的路径):
...
WITH gateway1 AS g
MATCH p=(g)-[:CONNECTED_TO*]->(x)
WHERE NOT (x)-[:CONNECTED_TO]->()
RETURN p;
而且,如果您还希望能够在其子图中没有其他节点时仅返回根网关节点,您可以更改*
为*0..
:
...
WITH gateway1 AS g
MATCH p=(g)-[:CONNECTED_TO*0..]->(x)
WHERE NOT (x)-[:CONNECTED_TO]->()
RETURN p;
推荐阅读
- tailwind-css - Tailwind + Headless UI:点击或点击后关闭移动菜单
- python-3.x - 是否可以使用 ExChangeLib (EWS) 从 Outlook 中检索数据和下载文件而无需密码?
- c# - 在 HotChocolate 中,有没有办法使用自定义授权?
- sql - 在 Spring Boot 实体类中使用 desc 作为字段名
- azure-devops - Azure Devops -----通过查询团队名称验证团队是否存在--存在返回true,不存在返回false(Bash,或AzureCLI)
- c++ - 我正在使用 boost::filtered_graph,但是 print_graph 和 write_graphviz 的输出不同——知道为什么吗?
- python - 带有 tkinter 的 Python 类无法解析对象项
- android - 在虚幻引擎中打包 GooglePAD 资产包时 Gradle 构建失败
- python - 如何在没有工人重生的情况下杀死 uwsgi 进程
- python - 满足条件时,使列行与另一列的匹配值具有相同的值