我可以使用ARQ代数( com.hp.hpl.jena.sparql.algebra )从sparql查询字符串中获取代数形式:
String queryStr =
"PREFIX foaf: <http://xmlns.com/foaf/0.1/>" +
"SELECT DISTINCT ?name ?nick" +
"{?x foaf:mbox <mailt:person@server> ." +
"?x foaf:name ?name" +
"OPTIONAL { ?x foaf:nick ?nick }}";
Query query = QueryFactory.create(queryStr);
Op op = Algebra.compile(query);
打印op:
的返回值(distinct
(project (?name ?nick)
(join
(bgp
(triple ?x <http://xmlns.com/foaf/0.1/mbox> <mailt:person@server>)
(triple ?x <http://xmlns.com/foaf/0.1/name> ?nameOPTIONAL)
)
(bgp (triple ?x <http://xmlns.com/foaf/0.1/nick> ?nick)))))
返回值是一个Op类型,但我找不到任何可以将 op 解析为元素的直接方法,例如s,p,o的基本图形模式,以及它们之间的关系这些图形模式。
感谢任何提示,谢谢。
答案 0 :(得分:3)
为什么要将代数序列化?
如果您的目标是遍历代数树并提取BGP,那么您可以使用OpVisitor
接口执行此操作,其中有各种实现方法可以帮助您入门。您需要关注的特定方法是visit(OpBgp opBgp)
,因为您可以访问OpBgp
类的方法来提取模式信息
答案 1 :(得分:1)
可能为时已晚,但我还没有看到最终答案,所以我正在编写打印所有 BGP 的代码。
为此创建如下的类,扩展if let pathperdataselezionata = Bundle.main.path(forResource: "Annuale", ofType: "plist"),
let dictperdataselezionata = NSDictionary(contentsOfFile: pathperdataselezionata) as? [String: Any],
let dictAnnoscelto = dictperdataselezionata[annoscelto] as? [String: Any],
let dictMesescritto = dictAnnoscelto[mesescritto] as? [String: Any],
let daymonth = daymonth,
let valoridataodierna = dictMesescritto[daymonth] as? [Double]
{
let Grad = Int(valoridataodierna[0])
let Ampo:Double = valoridataodierna[1]
}
并覆盖公共无效访问(最终 OpBGP )函数,如下面代码所示。
从您的代码中只需调用函数:
OpVisitorBase
MyOpVisitorBase.myOpVisitorWalker(op);