如何解析Sparql代数中的元素

时间:2014-03-11 05:58:54

标签: sparql jena

我可以使用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的基本图形模式,以及它们之间的关系这些图形模式。

感谢任何提示,谢谢。

2 个答案:

答案 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);