我正在使用OrientDB类型图。 我需要Gremlin语法来搜索与SQL LIKE运算符相同的内容。
LIKE 'search%' or LIKE '%search%'
我已经使用 has 和 filter(在 http://gremlindocs.com/)进行了检查。然而,必须确定传递的确切值是使用 type 属性传递的。我认为这与搜索逻辑不符。
感谢任何帮助。
我正在使用OrientDB类型图。 我需要Gremlin语法来搜索与SQL LIKE运算符相同的内容。
LIKE 'search%' or LIKE '%search%'
我已经使用 has 和 filter(在 http://gremlindocs.com/)进行了检查。然而,必须确定传递的确切值是使用 type 属性传递的。我认为这与搜索逻辑不符。
感谢任何帮助。
对于Cosmos Db的Gremlin支持
g.V().has('foo', TextP.containing('search'))
你可以在Microsoft Gremlin支持文档和TinkerPop参考文献中找到文档。
尝试:
g.V().filter({ it.getProperty("foo").startsWith("search") })
或者
g.V().filter({ it.getProperty("foo").contains("search") })
filter
使用:gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> g.V.filter{it.name.matches(".*ark.*")}.name
==>marko
gremlin> g.V.filter{it.name==~/.*ark.*/}.name
==>marko
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().filter{it.get().value('name').matches(".*ark.*")}
==>v[1]
it.get().value('name')
中的 it
是Groovy标记,它引用流中的当前 Traverser
并保存通过 get()
检索到的Vertex
对象。
这种方法将在接受闭包的任何地方起作用,但并非所有图形都支持它们,因此并不是所有情况下都能使用。如果您不在JVM上(例如Python),则可能会向服务器提交Gremlin脚本或使用基于字节码的请求。如果您正在提交脚本,则应该能够像上面展示的那样提交请求。如果您使用字节码,则必须在遍历中显式声明lambda字符串,如Python中所示。
最后,不建议使用闭包/lambda,因为它们会降低您代码的可移植性,暴露安全漏洞等问题。如果您需要正则表达式,则最好使用具有本机支持和包含特定于程序语言的自定义谓词的图形工具库。
from gremlin_python.process.traversal import TextP
g.V().has('foo', TextP.containing('search'))
JanusGraph具有内置的全文本搜索功能,可以轻松地通过文本查询图形中的顶点和边。使用JanusGraph支持的任何索引后端(例如Elasticsearch),可以在不影响性能的情况下实现高效的全文搜索。可以使用Gremlin查询语言构建复杂的查询,并且可以方便地将全文搜索与其他JanusGraph查询组合使用。如果有读者需要这个答案,这里提供一个更新的搜索方法(与已接受答案非常相似)
对于Gremlin控制台(gremlin.sh):
g.V().filter({ it.get().value("foo").contains("search") })
如果您的索引后端是ElasticSearch(可能也适用于其他索引后端),那么以下内容同样适用:
g.V().has("foo", Text.textContains("search"))
g().V().has("tosearch", RegexPredicate.regex("search.*"))
RegexPredicate
import java.util.function.BiPredicate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.tinkerpop.gremlin.process.traversal.P;
// https://groups.google.com/forum/#!topic/gremlin-users/heWLwz9xBQc
// https://dev59.com/FWIk5IYBdhLWcg3wp_qM#45652897
public class RegexPredicate implements BiPredicate<Object, Object> {
Pattern pattern = null;
private Mode mode;
enum Mode {
FIND, MATCH
}
public RegexPredicate(String regex, Mode mode) {
this.mode = mode;
pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
};
public RegexPredicate(String regex) {
this(regex,Mode.FIND);
}
@Override
public boolean test(final Object first, final Object second) {
String str = first.toString();
Matcher matcher = pattern.matcher(str);
switch (mode) {
case FIND:
return matcher.find();
case MATCH:
return matcher.matches();
}
return false;
}
/**
* get a Regular expression predicate
*
* @param regex
* @return - the predicate
*/
public static P<Object> regex(Object regex) {
BiPredicate<Object, Object> b = new RegexPredicate(regex.toString());
return new P<Object>(b, regex);
}
}
public enum StringCompare implements BiPredicate<Object, Object> {
wildcard {
@Override
public boolean test(final Object first, final Object second) {
String str = first.toString();
String regex = second.toString();
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
return matcher.matches();
}
}
}
2) 按照Java规则创建您的正则表达式。我发现这个链接非常有帮助。http://www.developer.com/java/data/using-java-regular-expressions.html
3) 使用has()方法,将其传递给属性键,并创建一个新的P对象。
String regex = "Mar.*"; //2
GraphTraversal<Vertex,Vertex> gtv = g.V().has("name", new P<>(StringCompare.wildcard, regex)); //3
.matches(".*search.*")
- Minh Locg.V().filter({ !it.getProperty("foo").contains("search") })
- Daniel Kuppitz