当我有例如人物图表时,例如约翰和约翰有一个工作地址家庭地址电话号码关系等。
是否可以检索连接到john和john子类的所有内容而不知道它是什么?
所以我可以检索例如以下
John < address < house_number
< mobile_number
< company < address
< function < office number < etc...
And retrieve this via:
"John" rdfs:everything ?everything ... as deep as the tree goes.
或者我需要知道图表吗?
答案 0 :(得分:3)
您的术语有点过时,因为地址,手机号码等不是John的子类。 RDF是三元组(标记为有向边),John的地址是具有John hasAddress AddressOfJohn
形式的三元组的对象。用基于图表的术语来说,听起来你在问是否可以检索从约翰开始的某些有向路径可以到达的所有事物。使用具体数据更容易,因此我们假设您已获得此数据:
@prefix : <http://stackoverflow.com/q/20878795/1281433/> .
:john :hasAddress :addressOfJohn ;
:hasMobileNumber :mobileNumber ;
:hasCompany :company .
:addressOfJohn :hasHouseNumber :houseNumber .
:company :hasAddress :addressOfCompany ;
:hasFunction :function .
SPARQL 1.1增加了对Property Paths的支持,它有点像属性序列的正则表达式语言,包括典型的运算符,如*
(任意数量的重复)和+
(一个或多个)。不幸的是,你不能在属性路径中使用变量,所以你不能只做
:john ?p+ ?object
但是,如answer.semanticweb.com SPARQL: property paths without specified predicates中的类似问题所述,您可以构建一个与每个属性匹配的析取。例如,由于:
是一个已定义的前缀,因此是IRI,因此模式:|!:
将匹配任何属性(因为所有内容都是:
或者它不是“T)。那个(:|!:)+
是真正的通配路径。因此,我们可以编写如下的查询并获得相应的结果:
prefix : <http://stackoverflow.com/q/20878795/1281433/>
select ?object where {
:john (:|!:)+ ?object
}
---------------------
| object |
=====================
| :company |
| :function |
| :addressOfCompany |
| :mobileNumber |
| :addressOfJohn |
| :houseNumber |
---------------------
答案 1 :(得分:0)
这是 Joshua Taylor 的一个很好的解决方案,它似乎在 Apache Jena 上的查询有点不同。
SELECT ?o WHERE {
:john (<>|!<>)+ ?o
}
否则它会抛出错误“未解析的前缀:”