基于RDF本体模型和图数据库实现知识查询与推理
- 基于RDF本体模型和图数据库实现知识查询与推理
-
- 一、案例本体模型解释
- 二、数据构建与查询
Here’s the table of contents:
基于RDF本体模型和图数据库实现知识查询与推理
本文主要使用ONgDB图数据库和Neosemantics组件,展示了一个快速接入RDF数据的案例,关于组件的使用可以查看Neosemantics-Docs。另外Neosemantics-1.x组件和ONgDB-1.x的适配,软件发布链接可以查看Neosemantics-Releases。
Neosemantics是一个插件,可以在ONgDB中使用RDF。RDF是用于数据交换的W3C标准模型。Neosemantics以无损方式将RDF数据存储在ONgDB中(导入的RDF随后可以导出,而不会在此过程中丢失单个三元组)。也可以按需将属性图数据从 ONgDB 导出为 RDF。Neosemantics的其他功能包括模型映射和对ONgDB图的推理。
一、案例本体模型解释
本次案例本体分为三个部分,自定义本体层【Custom Ontology】、领域本体层【Domain Ontology】、实例数据层【Instance Data】,数据是按照三层设计来构建的。其中自定义本体层是领域本体的自定义扩展。
- 图片来源:QuickGraph#9 The fashion Knowledge Graph. Inferencing with Ontologies in Neo4j
从下面的链接访问
graphene.json 文件可以加载该本体模型的设计到Graphene工具。
# 从graphene.json加载本体模型的设计 https://github.com/ongdb-contrib/neosemantics-python-examples/blob/master/inferencing/ontologies/graphene.json
二、数据构建与查询
按照
一 中的设计,现在可以进行数据的构建了,关于如何运行数据采集、数据构建、数据查询,可以参考neosemantics-python-examples。下面是完整运行的脚本【可以快速体验RDF和属性图结合的使用】:
// ongdb-enterprise-1.0.x eosemantics-1.0.x // Resource Index | 导入RDF时需要给`Resource`节点的`uri`创建索引 CREATE INDEX ON :Resource(uri); // Index creation // 加载数据时为节点创建索引可以提高检索性能 CREATE INDEX ON :Item(itemId); CREATE INDEX ON :Department(deptName); CREATE INDEX ON :Category(catName); CREATE INDEX ON :Brand(brandName); // Import Clothing Materials Ontology // 导入服装材料本体 CALL semantics.importOntology("http://www.nsmntx.org/2019/10/clothingMaterials","Turtle", { keepLangTag: true, handleMultival: 'ARRAY'}); // Load data // 加载数据 LOAD CSV WITH HEADERS FROM "file:///next_products.csv" AS row MERGE (b:Brand { brandName : row.brandName }) MERGE (dep:Department { deptName: row.itemDepartment }) MERGE (cat:Category { catName: row.itemCategory }) MERGE (i:Item { itemId: row.itemId }) ON CREATE set i.itemName = row.itemName, i.composition = row.itemComposition, i.url = row.url MERGE (i)-[:IN_CAT]->(cat) MERGE (i)-[:IN_DEPT]->(dep) MERGE (i)-[:BY]->(b) ; // Annotate your data with the ontology // 将本体和数据实例连接 MATCH (c:Class) UNWIND c.label as langLabel WITH collect( {key: toLower(semantics.getValue(langLabel)), classNode: c }) as termToClassMap MATCH (i:Item) FOREACH (material IN [x in termToClassMap where toLower(i.composition) contains x.key | x.classNode ] | MERGE (i)-[:CONTAINS]->(material)) ; // Extend the ontology with custom categories // 自定义扩展本体`AnimalBasedMaterial` WITH '@prefix owl: <http://www.w3.org/2002/07/owl#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix clmat: <http://www.nsmntx.org/2019/10/clothingMaterials#> . @prefix ccat: <http://www.nsmntx.org/customCats#> . ccat:AnimalBasedMaterial a owl:Class ; rdfs:label "Animal-based material", "Materiales de origen animal"@es, "matière dorigine animale"@fr . clmat:Leather rdfs:subClassOf ccat:AnimalBasedMaterial . clmat:Silk rdfs:subClassOf ccat:AnimalBasedMaterial . clmat:Wool rdfs:subClassOf ccat:AnimalBasedMaterial . ' AS onto CALL semantics.importOntologySnippet(onto,"Turtle", { keepLangTag: true, handleMultival: 'ARRAY'}) YIELD terminationStatus, triplesLoaded RETURN terminationStatus, triplesLoaded ; // list synthetic materials in different languages // 列出不同语言的`合成材料` UNWIND ['es','en','fr'] AS lang MATCH (w:Class { name: 'SyntheticFibre'})<-[:SCO*]-(woolVariant) RETURN lang, COLLECT(semantics.getLangValue(lang,woolVariant.label)) as syntheticMaterials; // fleeces by Berghaus // 使用贝格豪斯的羊毛制作的产品 MATCH (:Category { catName: "Fleeces"})<-[:IN_CAT]-(i:Item)-[:BY]->(:Brand { brandName: "Berghaus"}) RETURN i.itemId as id, i.itemName as name, i.url as url, i.composition as composition; // Brands producing hoodies // 哪些品牌生产连帽衫 MATCH (:Category { catName: "Hoodies"})<-[:IN_CAT]-(i:Item)-[:BY]->(b:Brand) RETURN b.brandName as brand, count(i) as productCount ORDER BY productCount DESC LIMIT 5 ; // All leather products (explicit and implicit) // 查找所有皮革制品(显性使用皮革和隐性使用皮革) MATCH (leather:Class { name: "Leather"}) CALL semantics.inference.nodesInCategory(leather, { inCatRel: "CONTAINS" }) yield node AS product WITH product MATCH (product)-[:BY]->(b:Brand) return product.itemName AS product, b.brandName AS brand, product.composition AS composition ; // Vegan trainers // 查找没有使用动物材料的产品 MATCH (:Category {catName:"Trainers"})<-[:IN_CAT]-(item:Item)-[:BY]->(b:Brand), (ab:Class { name: "AnimalBasedMaterial"}) WHERE b.brandName IN ["Converse","New Balance","Nike","ASICS"] AND NOT semantics.inference.inCategory(item,ab,{ inCatRel: "CONTAINS" }) RETURN item.url, item.itemName, item.composition ;