我有存储在Neo4j的大型网络。 根据一个特定的根节点上,我想提取围绕节点的子图,并存储在别处。 所以,我需要的是一组节点,并符合我的筛选条件的边缘。
据我所知有外的开箱没有可用的解决方案。 有一个匹配器件可用图表 ,但它仅适用于完美的匹配。 所述的Neo4j API本身只定义图的遍历 ,我可以使用来定义/边缘应被访问哪些节点:
Traverser exp = Traversal
.description()
.breadthFirst()
.evaluator(Evaluators.toDepth(2))
.traverse(root);
现在,我可以在所有节点/边添加到集所有的路径,但是这是非常低效的。 你会怎么做呢? 谢谢!
编辑会是有意义的增加最后的节点和每个遍历到子图的最后一个关系?
至于图匹配,已被取代http://docs.neo4j.org/chunked/snapshot/cypher-query-lang.html这起得非常好,并支持可选的关系模糊配套配件。
对于子表示,我会用Cypher支架输出可能建造新的Cypher报表重新创建图形,就像SQL的出口,像
start n=node:node_auto_index(name='Neo')
match n-[r:KNOWS*]-m
return "create ({name:'"+m.name+"'});"
http://console.neo4j.org/r/pqf1rp为例
我通过构建基于所有遍历端点导出子解决它。
从建组最后一个节点,每一个穿越不起作用的边缘的子图,因为这不属于任何最短路径部分边缘将不包括在内。
该代码片段看起来是这样的:
Set<Node> nodes = new HashSet<Node>();
Set<Relationship> edges = new HashSet<Relationship>();
for (Node n : traverser.nodes())
{
nodes.add(n);
}
for (Node node : nodes)
{
for (Relationship rel : node.getRelationships())
{
if (nodes.contains(rel.getOtherNode(node)))
edges.add(rel);
}
}
每边加两次。 一次用于输出节点和一个时间用于输入节点。 使用一组,我可以保证它在集合中只有一次。
是可能的迭代仅呼入/呼出的边缘,但目前还不清楚如何循环(从边缘到其自身的节点)进行处理。 哪一类?他们属于哪一种? 这个片段没有这个问题。
见数据库倾销CYPHER声明
dump START n=node({self}) MATCH p=(n)-[r:KNOWS*]->(m) RETURN n,r,m;
还有用于导入第一数据库(DB1)的子图转换为第二(DB2)的例子。