我被要求使用一些非常扁平的三元组,它们的谓词中嵌入了有关其对象的信息。换句话说,几乎所有谓词都是owl:DatatypeProperties
。
:meeting1 :hasChair "Professor Gadget" .
:meeting1 :chairPhoneNumber "555-1212" .
:meeting1 :hasAttendee "William Gosset" .
我的团队一直在考虑在语义上扩展三元组。我认为这需要创建新的实体/ rdf:Resource
s / owl:Thing
。如果我有选择,我宁愿创建基于UUID的IRI(而不是使用空白节点。)
:meeting1 a :meeting .
:meeting1 :hasChair :ABC123 .
:meeting1 :hasAttendee :DEF999 .
:ABC123 a :person .
:ABC123 :name "Professor Gadget" .
:ABC123 :phoneNumber "555-1212" .
:DEF999 a :person .
:DEF999 :name "William Gosset" .
我知道我可以说
CONSTRUCT { ?m a :meeting } WHERE { ?m :hasChair ?c }
我怎么能说" Gadget教授"必须是某些:name
的{{1}},同一:person
有:person
" 555-1212"?
generate an urn/iri/uri dynamically显示如何:phoneNumber
构造一个SPARQL变量的URI和BIND
它。此外,我知道我可以使用INSERT
创建一个UUID。我能否在STRUUID()
声明中的INSERT
子查询中执行此操作?我希望Gadget教授的URI能够在会议主持声明,CONSTRUCT
声明和:phoneNumber
声明中持续存在,但我希望为名不同的人或主持会议的人提供新的UUID除:name
之外,我宁愿冒险将多个UUID分配给Gadget教授,也可能使用相同的UUID来引用多个会议主席。
答案 0 :(得分:2)
这是到目前为止的情况。我认为这就是我想要的,但仍然愿意接受建议。
附加三元组,前缀为:
prefix : <http://example.com/>
:meeting2 :hasChair "James Moriarty" .
:meeting2 :chairPhoneNumber "unlisted" .
:meeting2 :hasAttendee "William Gosset" .
构造声明:
prefix : <http://example.com/>
CONSTRUCT
{
?m a :meeting .
?m :hasChair ?u .
?u :name ?c
}
WHERE { ?m :hasChair ?c .
bind (URI(concat("http://example.com/",STRUUID())) as ?u)}
结果:
+----------------------------------------+------------+----------------------------------------+
| subject | predicate | object |
+----------------------------------------+------------+----------------------------------------+
| :09dfb998-cc34-48d3-830e-e480f09e94ba | :name | "James Moriarty"^^xsd:string |
| :323b0c9c-0b07-4f32-abb6-503c1d97d80e | :name | "Professor Gadget"^^xsd:string |
| :meeting1 | :hasChair | :323b0c9c-0b07-4f32-abb6-503c1d97d80e |
| :meeting1 | rdf:type | :meeting |
| :meeting2 | :hasChair | :09dfb998-cc34-48d3-830e-e480f09e94ba |
| :meeting2 | rdf:type | :meeting |
+----------------------------------------+------------+----------------------------------------+