Titan 在图创建时的 IllegalArgumentException

Titan's IllegalArgumentException on Graph creation

当我尝试在蓝图中实例化我的图形时遇到初始化错误。这是我用来创建新图表的代码:

String path = "conf/titan-cassandra-" + System.getProperty("env") + ".properties";
Graph graph = TitanFactory.open(path);

正在设置系统属性,文件存在。在 TitanFactory 中抛出错误:

final Pattern p = Pattern.compile("(" + 
Pattern.quote(GraphDatabaseConfiguration.STORAGE_NS.getName()) + "\..*" + "(" + 
Pattern.quote(GraphDatabaseConfiguration.STORAGE_DIRECTORY.getName()) + "|" + 
Pattern.quote(GraphDatabaseConfiguration.STORAGE_CONF_FILE.getName()) + ")" + "|" + 
Pattern.quote(GraphDatabaseConfiguration.INDEX_NS.getName()) + "\..*" + "(" + 
Pattern.quote(GraphDatabaseConfiguration.INDEX_DIRECTORY.getName()) + "|" + 
Pattern.quote(GraphDatabaseConfiguration.INDEX_CONF_FILE.getName()) + ")" + ")");

计算表达式 GraphDatabaseConfiguration.STORAGE_NS 得到 'null'。为什么会这样?

编辑:

我也包括堆栈跟踪

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.commons.lang.StringUtils.containsAny(Ljava/lang/String;[C)Z
    at com.thinkaurelius.titan.diskstorage.configuration.ConfigElement.<init>(ConfigElement.java:26)
    at com.thinkaurelius.titan.diskstorage.configuration.ConfigNamespace.<init>(ConfigNamespace.java:19)
    at com.thinkaurelius.titan.diskstorage.configuration.ConfigNamespace.<init>(ConfigNamespace.java:24)
    at com.thinkaurelius.titan.graphdb.configuration.GraphDatabaseConfiguration.<clinit>(GraphDatabaseConfiguration.java:81)
    at com.thinkaurelius.titan.core.TitanFactory.getLocalConfiguration(TitanFactory.java:240)
    at com.thinkaurelius.titan.core.TitanFactory.getLocalConfiguration(TitanFactory.java:170)
    at com.thinkaurelius.titan.core.TitanFactory.open(TitanFactory.java:61)
    at io.fama.api.service.GraphHolder.populateGraph(GraphHolder.java:28)
    at io.fama.api.service.GraphHolder.graph(GraphHolder.java:21)
    at io.fama.api.DebugTests.main(DebugTests.java:7)

当 Maven 运行测试时,它会抛出一个不同的错误。这个好像跟依赖关系有关。

您没有包括堆栈跟踪,但它很容易从 Gremlin shell 重现。当运行宁gremlin.sh时,通常最好从$TITAN_HOME目录中运行它,而不是$TITAN_HOME/bin.

gremlin> graph = TitanFactory.open('conf/titan-cassandra-test.properties')
Backend shorthand unknown: conf/titan-cassandra-test.properties
Display stack trace? [yN] y
java.lang.IllegalArgumentException: Backend shorthand unknown: conf/titan-cassandra-test.properties
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:120)
    at com.thinkaurelius.titan.core.TitanFactory.getLocalConfiguration(TitanFactory.java:175)
    at com.thinkaurelius.titan.core.TitanFactory.open(TitanFactory.java:61)

你需要注意相对路径。您很可能 运行 从不同的目录安装程序,这样属性文件的相对路径就无法解析。 运行 来自正确父目录的程序或使用绝对路径。

您的异常导致这行代码:

Preconditions.checkArgument(!StringUtils.containsAny(name, ILLEGAL_CHARS),"Name contains illegal character: %s (%s)",name,ILLEGAL_CHARS);

我们可以在非法字符声明中看到:

public static final char[] ILLEGAL_CHARS = new char[]{SEPARATOR,' ','\t','#','@','<','>','?','/',';','"','\'',':','+','(',')','*','^','`','~','$','%','|','\','{','[',']','}'};

ConfigElement(第 18 行)摘要 class 的构造函数中的这一行阻止了以下任何字符出现在路径中。

Tabs, New Line characters, # @ < > ? / ; " ' : + ( ) * ^ ` ~ $ % | \ { [ ] } and the .

所以问题不是 absolute/relative 路径问题。

但是,您遇到的错误与 StringUtils 上的 .containsAny 方法有关。据我所知,它抛出了那个错误,因为 Preconditions checkState methods(Line 172) do not have a valid call for all four of the parameters given.(第 26 行)。这使我相信您会收到此错误,因为无法进行检查,因为没有可用的方法。

我发现 this 很有帮助,因为它帮助我理解了

Ljava/lang/String;[C)Z

在你的stack-trace第一行的末尾有明确的意思。 此 Titan 包尝试调用的 StringUtils 包中不存在任何方法,并且将抛出此 NoSuchMethodError 直到定义了处理所有四个参数的方法。

传递属性文件的绝对路径为我解决了这个问题。