0

我对 HypergraphDB 相当陌生,并且正在运行一些测试来查看事情是如何工作的并遇到了这个问题。我创建了一个具有不同 HGRel 的超图,我想获得具有特定名称的超图,并尝试使用以下代码

List<HGRel> r = hg.getAll(graph, hg.and(hg.type(HGRel.class), hg.eq("name", "XXX")));

基本上我想找到所有名为“XXX”的超边,但不幸的是我收到了这个错误

java.lang.RuntimeException: org.hypergraphdb.HGException: Could not find projection for 'name' in HG type a5edd585-2d5c-4555-8fdf-f9954bd35fe9 for HGRel
at org.hypergraphdb.transaction.HGTransactionManager.ensureTransaction(HGTransactionManager.java:324)
at org.hypergraphdb.query.cond2qry.ExpressionBasedQuery.<init>(ExpressionBasedQuery.java:812)
at org.hypergraphdb.HGQuery.make(HGQuery.java:174)
at org.hypergraphdb.HyperGraph.find(HyperGraph.java:1524)
at org.hypergraphdb.HGQuery$hg$10.call(HGQuery.java:1753)
at org.hypergraphdb.HGQuery$hg$10.call(HGQuery.java:1)
at org.hypergraphdb.transaction.HGTransactionManager.transact(HGTransactionManager.java:400)
at org.hypergraphdb.transaction.HGTransactionManager.ensureTransaction(HGTransactionManager.java:327)
at org.hypergraphdb.HGQuery$hg.getAll(HGQuery.java:1746)

我总是可以在应用程序上获取所有 HGRel 和过滤器,但我想知道我在这里做错了什么。先感谢您

4

2 回答 2

0

很好找到了问题。HGRel 中没有名称的设置器。只需放置一个 setter,上面的代码就可以正常工作。

于 2018-01-11T16:26:30.090 回答
0

二传手不是故意的。它不是 HRel 的可变属性。当您创建 HGRel 原子时,通常应该使用 HGRelType 添加它们,而 HGRelType 本身将包含标签。

在您的情况下可能发生的情况是您将 HGRel 存储为 Java bean 而根本不使用 HGRelType。这是一种策略,但特定的 API(HGRelType、HGRel、HGRelTypeConstructor)不打算以这种方式使用。

我建议改为创建您自己的通用 LabeledLink 类,其中名称是一个 bean 属性,然后按它索引,以便您可以更有效地查询:

公共类 LabeledLink 扩展 HGPlainLink { 私有字符串标签;

公共 LabeledLink(HGHandle…targets) { super(targets); }

public void setLabel(String label) ...</p>

public String getLabel() {返回标签;} }

HGHandle 标签类型 = graph.getTypeSystem().getTypeHandle(LabeledLink.class); graph.getIndexManager().register(new ByPartIndexer(labeledType, “label”);

干杯,鲍里斯

于 2018-02-02T05:29:23.460 回答