【问题标题】:How to write a quad into a jena graph and then to file如何将四边形写入耶拿图然后归档
【发布时间】:2014-10-01 15:53:25
【问题描述】:

我想创建一个像 PersonA isIn RoomA atTime 12:00 这样的 Quadruple。我想将System.current.TimeStamp() 用于atTime。

我尝试通过以下方式创建四边形:

Node roomA_Node = NodeFactory.createURI(((Resource) roomA).getURI());
Node person1_Node = NodeFactory.createURI(((Resource) person1).getURI());
Node isin_node = NodeFactory.createURI(((Resource) ROOM_STREAM.isIn).getURI());
Node timestamp = NodeFactory.createLiteral("2001-10-26T21:32:52",
        XSDDatatype.XSDdateTime);

Quad q = new Quad(timestamp, person1_Node, isin_node, roomA_Node);

但是,现在我被卡住了,因为我想将其写入TTL(或类似的)文件?

有什么建议吗?

感谢您的回答!

【问题讨论】:

  • 我想你可能误解了四边形是什么。四边形不是“四位关系”或“带有主语、谓语、宾语和时间/间接宾语/其他东西的陈述”。四边形是三元组和图形名称。数据集可以具有包含三元组的命名图,因此您需要一个四元组来记录三元组和出现的图。
  • 这听起来更像是您只想要一个 n 元关系,在这种情况下,请查看 Defining N-ary Relations on the Semantic Web,您最终可能会得到类似 [] hasSubject personA ; hasLocation roomA ; atTime noon . 的数据。
  • 最后,发帖前请阅读标签说明;这个问题与“The Apache HTTP Server,通常称为 Apache,......一个开源 HTTP 服务器”无关。我已经删除了标签。
  • @JoshuaTaylor 非常感谢您的回答!您能否举一个具体的例子,如何在jena 中实现n-ary relation,因为我认为一个四元组可以由一个四元组实现?或者quad 不是我的问题的正确数据结构?
  • 我可以加入这个对话吗(我是 Vivien 的同事)。我们知道quad(在jena中)用于在命名图中存储三元组。我们的想法是“滥用”这个特性,给三元组加上时间戳。我不知道这是否实用(即,它会带来开销吗?),但我们只是想试一试。基本上我们想做的是这样的:RdfQuadruple q = new RdfQuadruple(subject, predicate, object, timestamp) 我们正在考虑在耶拿不使用空白节点的方法。

标签: rdf jena semantic-web


【解决方案1】:

单独编写三元组或四元组是非常不寻常的。 Jena 的 api 通常处理此类项目的集合,例如 Graph,或者更适合您的情况 DatasetGraph,甚至只是 java 集合。

Jena 的输出通常通过RDFDataMgr 处理。这里有几个选项:

  1. 非常简单的RDFDataMgr.writeQuads(OutputStream out, Iterator<Quad> iterator),只写N-Quads。
  2. 更通用的RDFDataMgr.write(OutputStream out, DatasetGraph dataset, Lang lang),支持多种格式。

前者调用起来很简单(在这种情况下是针对标准输出):

RDFDataMgr.writeQuads(System.out, Collections.singleton(q).iterator());

后者涉及更多:

DatasetGraph dsg = new DatasetGraphSimpleMem(); // very simple implementation
dsg.add(q);
RDFDataMgr.write(System.out, dsg, Lang.TRIG); // or NQUADS

【讨论】:

  • 感谢您的回答!据我了解,您建议将quad 添加到DatasetGraph。但是,我想知道这是否是解决我的问题的最佳方法,因为基本上我有第四个属性,我想将它添加到我的基本主题、prädicat 和 object 三元组中?我想这样做的原因是,我会将这些数据用作流并对我的数据进行一些推理并提出Which person is in Room A at time t?之类的问题(如我上面的示例所示)
【解决方案2】:

我相信在表示时间序列时无法避免空白节点 :: 特定度量或传感器的(时间戳、值)列表。 RDF 最初并不是为了表示时间序列而设计的,当然我们可以,但它为每个度量都带来了空白节点的额外成本。

一个 hasTimeStamp ts1, 有值 v1 hasTimeStamp ts2, hasValue v2

@mrquad 我不确定你是否能够表达你想要的。

【讨论】:

    猜你喜欢
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多