Neo4J:关系密码

Neo4J:关系密码,neo4j,cypher,relationship,Neo4j,Cypher,Relationship,我有以下格式的层次结构: Application.A Host.vm1 这意味着应用程序A有一个实例A1,该实例在主机vm1上运行,关系为“属于”和“依赖” Instance.A1-[:依赖于{roles:Instance}]->数据库db1 Host.vm2 这意味着应用程序A的实例A1依赖于数据库db1,该数据库的实例dbNode1在主机vm2上运行 我能够编写单独的密码并在JavaAPI中处理结果 我试图编写一个单独的密码,将应用程序作为输入(在本例中为a)&返回整个层次结构 像这样的 A

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

Application.A Host.vm1

这意味着应用程序A有一个实例A1,该实例在主机vm1上运行,关系为“属于”和“依赖”

Instance.A1-[:依赖于{roles:Instance}]->数据库db1 Host.vm2

这意味着应用程序A的实例A1依赖于数据库db1,该数据库的实例dbNode1在主机vm2上运行

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

我试图编写一个单独的密码,将应用程序作为输入(在本例中为a)&返回整个层次结构

像这样的

A.A1.vm1.db1.dbNode1.vm2

这可行吗?如果是的话,请给我一些建议


谢谢。

这当然是可能的

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

另外,要指示
a1
正在使用
db1
数据库的哪个实例,您确实需要
a1
dbNode1
之间存在直接关系。您不能只在
a1
db1
之间存在关系,因为不清楚
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;
请注意,此简单查询与不使用DB的应用程序实例不匹配。如果还需要匹配此类实例,可以使用
可选匹配
子句:

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;

这当然是可能的

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

另外,要指示
a1
正在使用
db1
数据库的哪个实例,您确实需要
a1
dbNode1
之间存在直接关系。您不能只在
a1
db1
之间存在关系,因为不清楚
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;
请注意,此简单查询与不使用DB的应用程序实例不匹配。如果还需要匹配此类实例,可以使用
可选匹配
子句:

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;

这当然是可能的

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

另外,要指示
a1
正在使用
db1
数据库的哪个实例,您确实需要
a1
dbNode1
之间存在直接关系。您不能只在
a1
db1
之间存在关系,因为不清楚
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;
请注意,此简单查询与不使用DB的应用程序实例不匹配。如果还需要匹配此类实例,可以使用
可选匹配
子句:

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;

这当然是可能的

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

另外,要指示
a1
正在使用
db1
数据库的哪个实例,您确实需要
a1
dbNode1
之间存在直接关系。您不能只在
a1
db1
之间存在关系,因为不清楚
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;
请注意,此简单查询与不使用DB的应用程序实例不匹配。如果还需要匹配此类实例,可以使用
可选匹配
子句:

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;

A1
不应该实际依赖于
dbNode1
,而不是
db1
?数据库可以有多个节点。因此,关系需要与数据库(因为数据库进行负载平衡)。好的,感谢您的澄清。我尝试了以下密码-不确定这是否是正确的方法-但有效。。。匹配(n{name:'A'})-[*…2]-(p{property:'instance'})-(k)其中id(n)id(k)返回n.name,p.name,k.name;
A1
不应该实际依赖于
dbNode1
,而不是
db1
?数据库可以有多个节点。因此,关系需要与数据库(因为数据库进行负载平衡)。好的,感谢您的澄清。我尝试了以下密码-不确定这是否是正确的方法-但有效。。。匹配(n{name:'A'})-[*…2]-(p{property:'instance'})-(k)其中id(n)id(k)返回n.name,p.name,k.name;
A1
不应该实际依赖于
dbNode1
,而不是
db1
?数据库可以有多个节点。因此,关系需要与数据库(因为数据库进行负载平衡)。好的,感谢您的澄清。我尝试了以下密码-不确定这是否是正确的方法-但有效。。。匹配(n{name:'A'})-[*…2]-(p{property:'instance'})-(k)其中id(n)id(k)返回n.name,p.name,k.name;
A1
不应该实际依赖于
dbNode1
,而不是
db1
?数据库可以有多个节点。因此,关系需要与数据库(因为数据库进行负载平衡)。好的,感谢您的澄清。我尝试了以下密码-不确定这是否是正确的方法-但有效。。。匹配(n{name:'A'})-[*…2]-(p{property:'instance'})-(k)其中id(n)id(k)返回n.name,p.name,k.name