Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 在Gremlin中可以计算树图之间的差异吗?_Neo4j_Tree_Cypher_Titan_Gremlin - Fatal编程技术网

Neo4j 在Gremlin中可以计算树图之间的差异吗?

Neo4j 在Gremlin中可以计算树图之间的差异吗?,neo4j,tree,cypher,titan,gremlin,Neo4j,Tree,Cypher,Titan,Gremlin,我有两个图是有效的树(即单根,无循环)。它们的差别极小:其中一个有一片叶子,而另一个没有。有没有一种方法可以使用Gremlin或潜在的其他图形查询语言(如Cypher)来返回表示这两棵树之间差异的图形 DOT示例: graph A { a -- b -- c; } graph B { a -- b -- c; b -- d; } graph C = graph B - graph A : // <-- How do I do that? graph C { b --

我有两个图是有效的树(即单根,无循环)。它们的差别极小:其中一个有一片叶子,而另一个没有。有没有一种方法可以使用Gremlin或潜在的其他图形查询语言(如Cypher)来返回表示这两棵树之间差异的图形

DOT示例:

graph A {
  a -- b -- c;
}

graph B {
  a -- b -- c;
  b -- d;
}

graph C = graph B - graph A : // <-- How do I do that?

graph C {
  b -- d;
}
图形A{
a--b--c;
}
图B{
a--b--c;
b--d;
}

图C=图B-图A://下面的junit测试是解决此问题的简单可行的解决方案。 有关算法,请参见注释。 有很多更好的方法可以做到这一点,但这只是为了表明有一个解决方案

package com.graph.test;
导入静态org.junit.Assert.assertEquals;
导入java.util.ArrayList;
导入java.util.List;
导入org.apache.tinkerpop.gremlin.structure.Direction;
导入org.apache.tinkerpop.gremlin.structure.Edge;
导入org.apache.tinkerpop.gremlin.structure.Graph;
导入org.apache.tinkerpop.gremlin.structure.Vertex;
导入org.apache.tinkerpop.gremlin.tinkergraph.structure.tinkergraph;
导入org.junit.Test;
/**
* https://stackoverflow.com/questions/38786038/is-it-possible-to-calculate-difference-between-tree-graphs-in-gremlin
* https://stackoverflow.com/questions/16553343/diff-for-directed-acyclic-graphs
*@author wz
*
*算法:
*第一步:与a和b的所有顶点和边相交
*第二步:删除a和b中相同的所有边
*步骤树:删除所有未连接的顶点
*    
*第三步没有在这里实施,第一步和第二步效率很低。这
*只是为了表明原则并有一个可行的解决方案
*
*/
公共类TestGraphDiff{
公共静态最终字符串SORTKEY=“SORTKEY”;
公共静态最终字符串LINK=“LINK”;
公共图getGraph(){
图g=TinkerGraph.open();
顶点a=g.addVertex(“a”);
顶点b=g.addVertex(“b”);
顶点c=g.addVertex(“c”);
b、 附录(链接,a);
c、 附录(链接,b);
返回g;
}
@试验
公共void testGraphDiff(){
图A=getGraph();
图B=getGraph();
顶点d=B。添加顶点(“d”);
顶点b=b.遍历().V().hasLabel(“b”).next();
d、 附录(链接,b);
图C=差异(A,B);
//应该还有一条边
assertEquals(1,C.traversal().E().count().next().longValue());
//应该还有两个顶点
assertEquals(2,C.traversal().V().count().next().longValue());
//剩余边缘应为“b-d”
assertEquals(“b-d”,C.traversal().E().next().property(SORTKEY.value().toString());
}
/**
*向给定边添加排序键
*@param e
*@return-排序键
*/
私有字符串addSortKey(边缘e){
字符串sortKey=e.inVertex().label()+“-”+e.outVertex().label();
e、 属性(SORTKEY,SORTKEY);
返回排序键;
}
/**
*求两个图的差
*@param a
*@param b
*@返回
*/
公共图差异(图a、图b){
//第一步:使两个图相交
图c=TinkerGraph.open();
//复制对象的所有顶点
a、 遍历().V().forEachRemaining(V->c.addVertex(V.label());
//复制图形的所有边
a、 遍历(){
顶点iva=e.inVertex();
顶点ova=e.outVertex();
顶点ivc=c.traversal().V().hasLabel(iva.label()).next();
顶点ovc=c.traversal().V().hasLabel(ova.label()).next();
addSortKey(e);
边缘=ovc.ADEDGE(如标签(),ivc);
addSortKey(边缘);
});
//复制b中尚未在c中的所有顶点
b、 遍历().V().forEachRemaining(V->{
如果(c.traversal().V().hasLabel(V.label()).count().next().longValue()==0){
c、 addVertex(v.label());
}
//复制尚未在c中的b的所有边
b、 遍历(){
顶点ivb=e.inVertex();
顶点ovb=e.outVertex();
顶点ivc=c.traversal().V().hasLabel(ivb.label()).next();
顶点ovc=c.traversal().V().hasLabel(ovb.label()).next();
字符串sortKey=addSortKey(e);
如果(!c.traversal().E().has(SORTKEY,SORTKEY).hasNext()){
边缘=ovc.ADEDGE(如标签(),ivc);
addSortKey(边缘);
}
});
});
//第二步:删除两个图中“相同”的所有边
//低效版本-使用排序列表会更快
//边缘的。。。
c、 遍历(){
字符串sortKey=e.property(sortKey).value().toString();
if(a.traversal().E().has(SORTKEY,SORTKEY).hasNext()&&
c、 遍历().E().has(SORTKEY,SORTKEY).hasNext()){
e、 删除();
}
});
//步骤三:删除所有“未连接”的顶点
c、 遍历().V().forEachRemaining(V->{
如果(!v.edges(Direction.BOTH).hasNext())
v、 删除();
});
返回c;
}
}

您希望此功能处理的差异程度如何?是否要忽略节点/关系上的属性?您需要说明关系类型,还是忽略它们?图之间的节点本身似乎不是相同的节点,那么如何识别它们呢?按标签/类型?