我正在ASWS Neptune上实现一个图形数据库,我也使用AWS OpenSearch来执行全文搜索。
我想要得到所有匹配属性的子顶点。(在本例中获取所有文档)
我做了以下操作:
g.V( folderId )
.emit()
.repeat( in().dedup() )
.in()
.hasLabel( "document" )
.valueMap()
.by( unfold() )
.toList();
这将返回该文件夹及其子文件夹中的所有文档。
现在我这样做是为了只返回该文件夹/子文件夹中与name
匹配的文档。
g.withSideEffect( "Neptune#fts.endpoint", "..." )
.V( folderId )
.has( "name", "Neptune#fts " + name + "*" )
.emit()
.repeat( in().dedup() )
.in()
.hasLabel( "document" )
.valueMap()
.by( unfold() )
.toList();
它返回一个空结果,但如果我删除folderId
,它返回所有与该名称匹配的文档。
任何方法只返回那些匹配的名称,并在该文件夹?
感谢如果没有某种类型的样本数据,很难给你一个查询,将满足您的要求,但你得到一个空结果的可能原因是,你没有遍历到任何子记录应用你的name
搜索。让我们看一下查询的这一部分:
g.withSideEffect( "Neptune#fts.endpoint", "..." )
.V( folderId )
.has( "name", "Neptune#fts " + name + "*" )
这是说"找到一个顶点与id=folderId
和name like name*
。只有当这两个条件都为真时,它才会返回一个值,我怀疑在这个场景中不是这样的。
如果你想找到name*
开头的特定顶点id的所有子documents
,那么你会想做一些更像:
g.withSideEffect( "Neptune#fts.endpoint", "..." )
.V( folderId ) //Find a vertex with folderId
.emit() //Emit the vertices
.repeat( in().dedup()) //Repeatedly go out the in edges until there are no more
.hasLabel( "document" ) //Filter to only document labels
.has( "name", "Neptune#fts " + name + "*" ) //Filter to find things with "name*"
.valueMap()
.by( unfold() )
.toList();
此外,由于海王星索引数据(这里)的方式,如果您可以为in()
边指定标签(如in('parent')
),则性能会更好。