Neo4J:关系密码

Neo4J: cypher for relations

我有以下格式的层次结构:

Application.A <-[:belongs_to {roles:instance}]-Instance.A1-[:depends_on {roles:host}]-> Host.vm1

暗示应用程序 A 有一个实例 A1,它是主机 vm1 上的 运行,具有 "belongs_to" 和 "depends_on".

的关系

Instance.A1-[:depends_on {roles:instance}]-> 数据库 db1 <-[:belongs_to]-Instance.dbNode1-[:depends_on {roles :host}]-> Host.vm2

暗示应用程序 A 的实例 A1 依赖于在主机 vm2 上具有实例 dbNode1 运行 的数据库 db1。

我能够编写单独的密码并在我的 java API 中处理结果。

我正在尝试编写一个将应用程序作为输入(在本例中为 A)和 return 整个层次结构的密码。

像这样....

A.A1.vm1.db1.dbNode1.vm2

这可行吗?如果是,将不胜感激。

谢谢。

当然可以。

我建议不要在你的关系中放置需要用于匹配目的的属性——因为 Cypher 还不允许你对它们进行索引。您应该只有特定的关系类型。

此外,要指出 db1 DB 的哪个实例正被 a1 使用,您确实需要 a1dbNode1 之间的直接关系。您不能只在 a1db1 之间建立关系,因为不清楚 a1 正在使用 db1 的哪个实例。

这是您可以执行的操作的示例:

MATCH
  (a1:Instance)-[:is_instance_of]->(a:Application {name: "MyApp"}),
  (a1)-[:runs_on_host]->(vm1:Host),
  (a1)-[:uses_db_type]->(db1:Database),
  (a1)-[:uses_db_instance]->(dbNode1:Instance)-[:is_instance_of]->(db1),
  (dbNode1)-[:runs_on_host]->(vm2:Host)
RETURN a.name + "." + a1.name + "." + vm1.name + "." + db1.name + "." + dbNode1.name + "." + vm2.name AS result;

请注意,这个简单的查询不会匹配不使用数据库的应用程序实例。如果您还需要匹配此类实例,则可以使用 OPTIONAL MATCH 子句:

MATCH
  (a1:Instance)-[:is_instance_of]->(a:Application {name: "MyApp"}),
  (a1)-[:runs_on_host]->(vm1:Host)
OPTIONAL MATCH
  (a1)-[:uses_db_type]->(db1:Database),
  (a1)-[:uses_db_instance]->(dbNode1:Instance)-[:is_instance_of]->(db1),
  (dbNode1)-[:runs_on_host]->(vm2:Host)
RETURN
  CASE WHEN db1 IS NULL THEN a.name + "." + a1.name + "." + vm1.name
       ELSE a.name + "." + a1.name + "." + vm1.name + "." + db1.name + "." + dbNode1.name + "." + vm2.name
       END
  AS result;