Cypher查询:是否有可能隐藏"具有"虚拟关系的现有路径"?

时间:2014-12-01 13:15:48

标签: neo4j cypher

我们正在开发一个项目,尝试使用Noe4J 2.1.5映射类似Java代码连接的结构。我们已经成功连接了Applications-Jars-Classes-Methods,例如可以得到Cypher的答案:

App1-->Jar1-->Class1-->Method1-->Method2-->Method3<--Class22<--Jar2<--App1

现在我们希望能够得到像这样连接的Jars的简明答案,&#34;隐藏&#34;上面的现有路径?

Jar1--Jar2

Cypher是否有可能在不创建像

这样的新关系的情况下获得此结果
Jar1-[:PATH_EXISTS]-Jar2

我们无法在手册中找到任何相关的折叠/隐藏路径,也无法在此处查找堆栈溢出

此致

Christofer

1 个答案:

答案 0 :(得分:1)

基本上有两种方法可以解决这个问题。

第一个是明确地建立新的关系,但我不会那么谈论这个,因为看起来你已经想到了并拒绝了它。这种方法很简单,但磁盘密集程度更高(取决于图表的大小)

第二种只是在需要时查询路径,使用如下所示的可变长度路径:

MATCH (jar1 {myid: "something"})-[*]->(jar2 {myid: "somethingelse"})
RETURN jar2;

这将为您提供所需,但需要在每次需要时重新计算这条遥远的路径。所以,它很简单,但计算量很大。

现在,更广泛地说,你想要的东西就像是graph inference engine。在OWL / RDF世界中,人们将创建描述不同类型实体及其之间关系的本体。这些关系的后果之一是它们可以传递并且可能对它们产生影响。一个典型的例子是一个人是一个实体,而motherOffatherOf之类的东西是它们之间的关系。因此,如果节点之间有fatherOf个关系的路径,即(A)-[:fatherOf]->(B)-[:fatherOf]->(C),则推理引擎将返回&#34;事实&#34; (A)(C)与家人有关。这将是您的本体论定义的结果。那个&#34;事实&#34;在RDF商店中实际上 实际上只是需要

在你的情况下,你做的事情就像写一个本体,指明你的图中你所拥有的所有个人关系都是某种关系类型的特化(比如&#34;与#34相关;) 。然后,您可以询问推理者是否与&#34;相关&#34; Jar1和Jar2之间存在关系,由于你的本体论定义,答案是肯定的。

好的,所以坏消息是 neo4j不是RDF并且没有做到这一点。而且,做这种事情比我让它听起来更难;正确的本体建模本身就是一门艺术,与20世纪70年代的序言世界的逻辑编程不同。但基本上,这种推理就像你正在寻找的那样。

我认为您在未来的neo4j版本中可能会希望的是类似于数据库&#34; view&#34;或更好的架构支持。即应该可以指定每当某种关系模式成立时,也应该存在其他一些关系。