关于Freebase子知识图谱中实体类型判定的技术问询
Freebase实体多类型判定与SPARQL查询优化
在Freebase里,一个实体往往会被标记多个类型,要确定它在某条子图谱里对应的具体类型,核心思路是结合三元组的上下文关系来筛选:
一、针对示例的具体判定方法
你给出的子图谱是['m.0f010_', 'food.dish.cuisine', 'm.042ck'],其中关系food.dish.cuisine的含义是「菜品所属的菜系」,所以实体m.042ck在这里的角色肯定是菜系。
从它的所有类型里:
- 优先保留和菜系强相关的:
dining.cuisine(餐饮菜系)、base.food_menu.regional_cuisine(地域菜系) - 直接忽略通用类型:
common.topic是Freebase里几乎所有实体都带的默认类型,没有实际业务语义;base.ontologies.ontology_instance这类本体实例类型也不属于具体业务类型,可排除 - 剩下的
book.book_subject(图书主题)、business.industry(行业)等类型和当前三元组的上下文完全不相关,直接排除
二、SPARQL查询的优化方案
你当前的查询只是获取实体的所有类型,没法直接筛选出符合上下文的结果,可以做以下优化:
1. 直接筛选目标领域类型
如果已经明确要找的类型范围,比如菜系相关,可以在查询里加过滤条件:
PREFIX fb: <http://rdf.freebase.com/ns/> select ?o1 where { fb:%s fb:type.object.type ?o1. # 只保留菜系相关的类型 FILTER (?o1 IN (fb:dining.cuisine, fb:base.food_menu.regional_cuisine)) }
2. 结合三元组上下文关联查询
如果要确保类型和当前子图谱的关系匹配,可以把三元组也加入查询,同时过滤领域前缀:
PREFIX fb: <http://rdf.freebase.com/ns/> select distinct ?o1 where { # 子图谱中的三元组 fb:m.0f010_ fb:food.dish.cuisine fb:m.042ck. # 查询实体类型 fb:m.042ck fb:type.object.type ?o1. # 筛选餐饮/食品菜单领域的类型 FILTER (STRSTARTS(STR(?o1), "http://rdf.freebase.com/ns/dining.") || STRSTARTS(STR(?o1), "http://rdf.freebase.com/ns/base.food_menu.")) }
3. 排除通用类型
如果想去掉所有无意义的通用类型,可以加过滤条件排除:
PREFIX fb: <http://rdf.freebase.com/ns/> select ?o1 where { fb:%s fb:type.object.type ?o1. # 排除通用类型 FILTER (?o1 != fb:common.topic && ?o1 != fb:base.ontologies.ontology_instance) }
内容的提问来源于stack exchange,提问作者ziens Tot
相关产品推荐
相关产品推荐

