graph - 如何使用 gremlin 在 titan 图形数据库中查找 clique?

标签 graph neo4j titan gremlin

我需要找到所有 cliques我图表中的三种尺寸 Gremlin .我能够在 neo4j 中使用 cypher 做到这一点:

MATCH (a)-[:edge]-(b)-[:edge]-(c)-[:edge]-(a)
RETURN a,b,c

例子是:A->B->C->A

基于@pkohan 的回答的一种可能的解决方案是:

g.V().as('x').sideEffect{x = it}.out().loop(1){it.loops < 4}{if(it.loops==4){if(it.object.id==x.id){true}else{false}}else{false}}.path.dedup().collect{"${it[0].id}->${it[1].id}->${it[2].id}"}

有人有其他想法吗?

最佳答案

这是一个在大图上效率极低的查询,但可以达到您的预期:

g.V().filter{it.out().loop(1){it.loops < 3}.id.filter{i -> it.id == i}.hasNext()}.map

这将返回一个包含顶点的管道,这些顶点可以在走完三个出边后指向自身。您可以通过更改 it.loops < 3 来更改要遵循的边数在闭包中。您可以通过更改 out() 来处理传入边至 in() , 或者您可以使用 both() 遵循任一方向.您还可以通过将边缘类型放在括号中来缩小边缘类型,例如:

g.V().filter{it.out("EDGE_TYPE").loop(1){it.loops < 3}.id.filter{i -> it.id == i}.hasNext()}.map

我不确定 neo4j 是否具有使该查询在大型数据库上可行的优化,但我认为在具有数百万条边和顶点的泰坦图上运行该查询会很危险。

关于graph - 如何使用 gremlin 在 titan 图形数据库中查找 clique?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29683663/

相关文章:

elasticsearch - 无法在 Titan 中添加混合索引

algorithm - 使用 Kruskal 算法查找图的最小生成树

android - MPAndroidChart- 如何在图表表等网格内添加单元格?

graph - Vis.js - 获取节点的子节点

neo4j - 按列表中的元素过滤的模式?

java - Spring Data Neo4j "No property get found for type"异常

java - Java应用程序中的Neo4j查询:No result is displaying[Still fail to solve it]

solr - 如何在Titan图形服务器上利用ElasticSearch/Solr搜索API?

unique - 如何避免 DSE 图/Titan 中的重复顶点条目

c - 我该如何更改Graph结构(插入速度非常慢)?