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 中执行相同的定向查询,但无济于事,所以我的问题是:

  1. 我的 Cypher 查询可能有什么问题?
  2. 是否可以在 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,一种选择是将查询放入这样的搜索短语中:

生成的可视化将仅显示查询匹配关系: