Cypher 和 Neo4j Bloom 中的定向搜索
Directed search in Cypher and Neo4j Bloom
给定以下模型:
Nodes: Host, Listener
Relations: Host -HOSTS-> Listener, Listener -CONNECTS_TO-> Listener
我想对 CONNECTS_TO 关系执行定向搜索,以查看从主机 A 到主机 B 的路径,但前提是 A 上存在连接到 B 上的侦听器的侦听器。类似这个:
(A:Host)-[:HOSTS]-(L_A:Listener)-[:CONNECTS_TO]->(L_B:Listener)-[:HOSTS]-(B:Host)
例如,如果我确实有关系 L_A -CONNECTS_TO-> L_B,查询应该 return 路径 A->L_A->L_B<-B,
但是如果我也有关系 L_B-CONNECTS_TO->L_A 查询应该仍然 return 只有第一条路径,因为我正在寻找从 A 到 B 的路径,如果我唯一的关系是第二个关系,则查询不应 return 任何东西,因为 A 无法连接到 B,只能连接 B 到 A。
我的 Cypher 查询看起来像这样,但所有关系仍然是 returned:
match path=(A:Host)-[:HOSTS]-(L_A:Listener)-[:CONNECTS_TO*1]->(L_B:Listener)-[:HOSTS]-(B:Host)
where A.name = 'hostA' and B.name = 'hostB'
return path;
但 Neo4j 浏览器仍然 return 提供 A 和 B 之间的所有路径,而不考虑 CONNECTS_TO 的方向。我也尝试在 Bloom 中执行相同的定向查询,但无济于事,所以我的问题是:
- 我的 Cypher 查询可能有什么问题?
- 是否可以在 Bloom 中执行这种定向搜索(因为我在那里似乎看不到任何方向)?
谢谢!
LE:图形生成
create
(_0:`Host` {`name`:"hostA"}),
(_1:`Host` {`name`:"hostB"}),
(_2:`Host` {`name`:"hostC"}),
(_3:`Listener` {`name`:"listenerA"}),
(_4:`Listener` {`name`:"listenerB"}),
(_5:`Listener` {`name`:"listenerC"}),
(_0)-[:`HOSTS`]->(_3),
(_1)-[:`HOSTS`]->(_4),
(_2)-[:`HOSTS`]->(_5),
(_3)-[:`CONNECTS_TO`]->(_5),
(_3)-[:`CONNECTS_TO`]->(_4),
(_4)-[:`CONNECTS_TO`]->(_3),
(_5)-[:`CONNECTS_TO`]->(_4)
查询我在 A 和 B 之间的唯一直接路径:
match path=(source:Host)-[:HOSTS]-(l_source:Listener)-[:CONNECTS_TO*1]->(l_dest:Listener)-[:HOSTS]-(dest:Host) where source.name = 'hostA' and dest.name = 'hostB' return path;
https://console.neo4j.org/ 在这里,它似乎工作得很好,仔细观察 Neo4j 浏览器中的 json/text/table 结果似乎也是正确的,只是可视化显示了所有关系,而不管方向.有没有办法只显示我感兴趣的那些?我知道它们可以解释为双向的,但在这种情况下,方向非常重要。
在Bloom中,即使搜索路径是正确的,找到的节点数也是正确的,在本例中是4(hostA,listenerA,listenerB,hostB),所有的节点和关系都显示出来了,这这是我试图避免的,因为我们的结构非常大,我们只想可视化某些路径。
it's just that the visualization shows all the relations regardless of direction. Is there a way to display only the ones that I'm interested in?
如果只是可视化,您是否关闭了浏览器中的连接结果节点功能?
打开该选项后,我得到:
已关闭:
对于 Bloom,一种选择是将查询放入这样的搜索短语中:
生成的可视化将仅显示查询匹配关系:
给定以下模型:
Nodes: Host, Listener
Relations: Host -HOSTS-> Listener, Listener -CONNECTS_TO-> Listener
我想对 CONNECTS_TO 关系执行定向搜索,以查看从主机 A 到主机 B 的路径,但前提是 A 上存在连接到 B 上的侦听器的侦听器。类似这个:
(A:Host)-[:HOSTS]-(L_A:Listener)-[:CONNECTS_TO]->(L_B:Listener)-[:HOSTS]-(B:Host)
例如,如果我确实有关系 L_A -CONNECTS_TO-> L_B,查询应该 return 路径 A->L_A->L_B<-B, 但是如果我也有关系 L_B-CONNECTS_TO->L_A 查询应该仍然 return 只有第一条路径,因为我正在寻找从 A 到 B 的路径,如果我唯一的关系是第二个关系,则查询不应 return 任何东西,因为 A 无法连接到 B,只能连接 B 到 A。
我的 Cypher 查询看起来像这样,但所有关系仍然是 returned:
match path=(A:Host)-[:HOSTS]-(L_A:Listener)-[:CONNECTS_TO*1]->(L_B:Listener)-[:HOSTS]-(B:Host)
where A.name = 'hostA' and B.name = 'hostB'
return path;
但 Neo4j 浏览器仍然 return 提供 A 和 B 之间的所有路径,而不考虑 CONNECTS_TO 的方向。我也尝试在 Bloom 中执行相同的定向查询,但无济于事,所以我的问题是:
- 我的 Cypher 查询可能有什么问题?
- 是否可以在 Bloom 中执行这种定向搜索(因为我在那里似乎看不到任何方向)?
谢谢!
LE:图形生成
create
(_0:`Host` {`name`:"hostA"}),
(_1:`Host` {`name`:"hostB"}),
(_2:`Host` {`name`:"hostC"}),
(_3:`Listener` {`name`:"listenerA"}),
(_4:`Listener` {`name`:"listenerB"}),
(_5:`Listener` {`name`:"listenerC"}),
(_0)-[:`HOSTS`]->(_3),
(_1)-[:`HOSTS`]->(_4),
(_2)-[:`HOSTS`]->(_5),
(_3)-[:`CONNECTS_TO`]->(_5),
(_3)-[:`CONNECTS_TO`]->(_4),
(_4)-[:`CONNECTS_TO`]->(_3),
(_5)-[:`CONNECTS_TO`]->(_4)
查询我在 A 和 B 之间的唯一直接路径:
match path=(source:Host)-[:HOSTS]-(l_source:Listener)-[:CONNECTS_TO*1]->(l_dest:Listener)-[:HOSTS]-(dest:Host) where source.name = 'hostA' and dest.name = 'hostB' return path;
https://console.neo4j.org/ 在这里,它似乎工作得很好,仔细观察 Neo4j 浏览器中的 json/text/table 结果似乎也是正确的,只是可视化显示了所有关系,而不管方向.有没有办法只显示我感兴趣的那些?我知道它们可以解释为双向的,但在这种情况下,方向非常重要。
在Bloom中,即使搜索路径是正确的,找到的节点数也是正确的,在本例中是4(hostA,listenerA,listenerB,hostB),所有的节点和关系都显示出来了,这这是我试图避免的,因为我们的结构非常大,我们只想可视化某些路径。
it's just that the visualization shows all the relations regardless of direction. Is there a way to display only the ones that I'm interested in?
如果只是可视化,您是否关闭了浏览器中的连接结果节点功能?
打开该选项后,我得到:
已关闭:
对于 Bloom,一种选择是将查询放入这样的搜索短语中:
生成的可视化将仅显示查询匹配关系: