gpt4 book ai didi

java - 如何在 Java 代码中编写使用相似性度量的 SPARQL 查询

转载 作者:行者123 更新时间:2023-12-02 16:20:06 24 4
gpt4 key购买 nike

我想知道用 Java 代码编写此 SPARQL 查询的简单方法:

select ?input
?string
(strlen(?match)/strlen(?string) as ?percent)
where {
values ?string { "London" "Londn" "London Fog" "Lando" "Land Ho!"
"concatenate" "catnap" "hat" "cat" "chat" "chart" "port" "part" }

values (?input ?pattern ?replacement) {
("cat" "^x[^cat]*([c]?)[^at]*([a]?)[^t]*([t]?).*$" "$1$2$3")
("Londn" "^x[^Londn]*([L]?)[^ondn]*([o]?)[^ndn]*([n]?)[^dn]*([d]?)[^n]*([n]?).*$" "$1$2$3$4$5")
}

bind( replace( concat('x',?string), ?pattern, ?replacement) as ?match )
}
order by ?pattern desc(?percent)

此代码包含在讨论 To use iSPARQL to compare values using similarity measures 中。此代码的目的是在 DBPedia 上查找与给定单词相似的资源。这种方法考虑到我事先知道字符串及其长度。我想知道如何用参数化方法编写此查询,无论单词和长度如何,它都会向我返回相似性度量。

最佳答案

更新: ARQ - Writing Property Functions现在是标准 Jena 文档的一部分。

您似乎希望对 SPARQL 进行语法扩展,以执行查询中更复杂的部分。例如:

SELECT ?input ?string ?percent WHERE
{
VALUES ?string { "London" "Londn" "London Fog" "Lando" "Land Ho!"
"concatenate" "catnap" "hat" "cat" "chat" "chart" "port" "part" }

VALUES ?input { "cat" "londn" }

?input <urn:ex:fn#matches> (?string ?percent) .
}
ORDER BY DESC(?percent)

在此示例中,假设 <urn:ex:fn#matches>是一个属性函数,会自动进行匹配操作并计算相似度。

耶拿文档很好地解释了如何 write a custom filter function ,但(截至 2014 年 7 月 8 日)几乎没有解释如何实现自定义属性函数。

我将假设您可以将答案转换为java代码以计算字符串相似度,并重点关注可以容纳您的代码的属性函数的实现。

实现属性函数

每个属性函数都与特定的Context相关联。 。这允许您将函数的可用性限制为全局或与特定数据集关联。

假设您有 PropertyFunctionFactory 的实现(稍后显示),您可以按如下方式注册该功能:

注册

final PropertyFunctionRegistry reg = PropertyFunctionRegistry.chooseRegistry(ARQ.getContext());
reg.put("urn:ex:fn#matches", new MatchesPropertyFunctionFactory);
PropertyFunctionRegistry.set(ARQ.getContext(), reg);

全局注册和特定于数据集的注册之间的唯一区别在于 Context 的位置。对象来自:

final Dataset ds = DatasetFactory.createMem();
final PropertyFunctionRegistry reg = PropertyFunctionRegistry.chooseRegistry(ds.getContext());
reg.put("urn:ex:fn#matches", new MatchesPropertyFunctionFactory);
PropertyFunctionRegistry.set(ds.getContext(), reg);

MatchesPropertyFunctionFactory

public class MatchesPropertyFunctionFactory implements PropertyFunctionFactory {
@Override
public PropertyFunction create(final String uri)
{
return new PFuncSimpleAndList()
{
@Override
public QueryIterator execEvaluated(final Binding parent, final Node subject, final Node predicate, final PropFuncArg object, final ExecutionContext execCxt)
{
/* TODO insert your stuff to perform testing. Note that you'll need
* to validate that things like subject/predicate/etc are bound
*/
final boolean nonzeroPercentMatch = true; // XXX example-specific kludge
final Double percent = 0.75; // XXX example-specific kludge
if( nonzeroPercentMatch ) {
final Binding binding =
BindingFactory.binding(parent,
Var.alloc(object.getArg(1)),
NodeFactory.createLiteral(percent.toString(), XSDDatatype.XSDdecimal));
return QueryIterSingleton.create(binding, execCtx);
}
else {
return QueryIterNullIterator.create(execCtx);
}
}
};
}

}

因为我们创建的属性函数采用列表作为参数,所以我们使用 PFuncSimpleAndList 作为抽象实现。除此之外,这些属性函数内部发生的大部分魔法都是 Binding 的创建。 s,QueryIterator s,并对输入参数进行验证。

验证/结束注释

如果您想在其中存放字符串匹配逻辑,这应该足以让您继续编写自己的属性函数。

没有显示的是输入验证。在这个答案中,我假设subject并且第一个列表参数 ( object.getArg(0) ) 已绑定(bind) ( Node.isConcrete() ),第二个列表参数 ( object.getArg(1) ) 不是 ( Node.isVariable() )。如果你的方法不以这种方式调用,事情就会爆炸。强化方法(使用条件检查放置许多 if-else block )或支持替代用例(即:查找 object.getArg(0) 如果它是变量)则留给读者(因为演示起来很乏味,易于测试) ,并且在实现过程中显而易见)。

关于java - 如何在 Java 代码中编写使用相似性度量的 SPARQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24610971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com