neo4j中的子图提取
我有一个存储在Neo4j中的大型网络。基于一个特定的根节点,我想在该节点周围提取一个子图并将其存储在其他地方。因此,我需要的是一组符合过滤条件的节点和边 恐怕没有现成的解决方案。有一种方法,但它只适用于完美匹配。Neo4j API本身只定义了我可以用来定义应该访问哪些节点/边的部分:neo4j中的子图提取,neo4j,subgraph,Neo4j,Subgraph,我有一个存储在Neo4j中的大型网络。基于一个特定的根节点,我想在该节点周围提取一个子图并将其存储在其他地方。因此,我需要的是一组符合过滤条件的节点和边 恐怕没有现成的解决方案。有一种方法,但它只适用于完美匹配。Neo4j API本身只定义了我可以用来定义应该访问哪些节点/边的部分: Traverser exp = Traversal .description() .breadthFirst() .evaluator(Evaluators.toDepth(2))
Traverser exp = Traversal
.description()
.breadthFirst()
.evaluator(Evaluators.toDepth(2))
.traverse(root);
现在,我可以为所有路径将所有节点/边添加到集合中,但这非常低效。你会怎么做?谢谢
编辑将每个遍历的最后一个节点和最后一个关系添加到子图中是否有意义?对于图形匹配,它已被替代,可以很好地匹配,并支持带有可选关系的模糊匹配 对于子图表示,我可能会使用Cypher输出来构造新的Cypher语句来重新创建图,就像SQL导出一样,类似于
start n=node:node_auto_index(name='Neo')
match n-[r:KNOWS*]-m
return "create ({name:'"+m.name+"'});"
例如,我通过基于所有遍历端点构造诱导子图来解决这个问题 从每个遍历的最后一个节点和边的集合构建子图不起作用,因为不属于任何最短路径的边将不包括在内 代码段如下所示:
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);
}
}
Set nodes=newhashset();
Set edges=new HashSet();
对于(节点n:traverser.nodes())
{
节点。添加(n);
}
用于(节点:节点)
{
对于(关系rel:node.getRelationships())
{
if(nodes.contains(rel.getOtherNode(node)))
添加(rel);
}
}
每个边添加两次。一次用于传出节点,一次用于传入节点。使用集合,我可以确保它只在集合中出现一次
可以只迭代传入/传出边,但不清楚如何处理循环(从节点到自身的边)。它们属于哪一类?此代码段没有此问题。请参阅
还有一个将第一个数据库(db1)的子图导入第二个数据库(db2)的示例
dump START n=node({self}) MATCH p=(n)-[r:KNOWS*]->(m) RETURN n,r,m;