drools 7 日期时间段校验

本文分享一个drools校验日期区间内时间段的校验方法。

       案例如下:电商品台新增一个促销活动,2019年10月份,限时每天10点至13点,下单9折活动。

      首先可以用 date-effective 和 date-expires 两个属性限制日期区间为2019-10-01 至 2019-10-31,但是每天10点至11点该怎样限制呢?下面给出我的想法,算是抛砖引玉。

1、方法一:利用function

drl文件如下所示:

package rules;//包名
//引入类库
import java.text.SimpleDateFormat
import java.util.*

//处理时间的function
function boolean checkDate(String st ,String et){
	 Calendar calendar = Calendar.getInstance();
     SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
     Date startTime = sdf.parse(st);
     Date endTime = sdf.parse(et);
     Date nowCal = sdf.parse(sdf.format(calendar.getTime()));
     if(nowCal.after(startTime)  && nowCal.before(endTime)){
        return true;
     }else{
         return false;
     }
}

//规则
rule "function_rule"
//属性限制起止日期
date-effective '2019-10-01'
date-expires '2019-10-31'

when
//对时间点进行校验
eval(checkDate('10:00:00','13:00:00'))
then
System.out.println("success function_rule");
end

2、方法二:利用Calendar判断

package rules;

import java.text.SimpleDateFormat
import java.util.*

rule "method_2"
date-effective "2019-10-01"
date-expires "2019-10-31"
when
$c:Calendar((get(Calendar.HOUR_OF_DAY) >=10 && <17),(get(Calendar.MINUTE) >=0 && <=59),(get(Calendar.SECOND) >=0 && <=59))
//(get(Calendar.HOUR_OF_DAY) >=10 && <17) 等价于 (get(Calendar.HOUR_OF_DAY) >=10,(get(Calendar.HOUR_OF_DAY)<17
then
System.out.println("success method_2");
end

这种方式需要在kieSession中insert一个Calendar实例。相对于方法一写法清秀了很多,一些细节上的内容也更清楚一些。

        以上就是个人的一些拙见,如果您有更好的还希望您能不吝赐教。

<think>嗯,用户想了解自底向上构建知识图谱的方法和过程。首先,我需要回忆一下相关的知识。根据引用[2],自底向上构建是一个迭代过程,分为信息抽取、知识融合和知识加工三个阶段。那我应该先从这三个阶段开始解释。 信息抽取阶段,需要从非结构化数据中提取实体、关系和属性。比如,实体识别可以用NER技术,像BERT这样的模型效果不错。然后关系抽取可能需要模式匹配或者监督学习。属性抽取则要识别实体的特征,比如年龄、位置等。这部分需要举例子,比如从句子中提取“苹果”作为公司实体,它的属性是市值。 接下来是知识融合,这部分要解决数据异构的问题。实体链接可能需要用到上下文消歧,比如“苹果”是指公司还是水果。知识合并则要把不同来源的数据整合,可能需要处理冲突,比如同一实体的不同名称。这里可以提到使用知识库如DBpedia或Wikidata作为参考。 然后是知识加工,包括本体构建、知识推理和质量评估。本体构建可能需要自动生成本体,使用聚类或层次关系挖掘。知识推理可以通过规则或嵌入模型来发现隐含关系,比如子类关系。质量评估要检查准确性和一致性,可能需要人工审核或自动化工具。 实现细节方面,技术选型很重要。信息抽取可能需要SpaCy或StanfordNLP,知识存储可以用Neo4j或者RDF数据库。优化部分需要处理数据噪声,增量更新和分布式计算框架如Apache Spark。 用户可能需要更具体的例子,比如NER的具体模型,或者如何解决实体歧义。还有可能想知道各个阶段的挑战,比如数据量大时的处理方式,或者如何保证数据质量。此外,生成的相关问题需要考虑用户可能进一步的需求,比如工具对比或质量评估方法。 要确保回答结构清晰,分阶段说明,每个步骤有实现细节和例子。引用标记要正确对应,比如信息抽取部分引用[2]和[3],知识融合引用[3]。最后的问题要覆盖方法、挑战、工具和应用场景,帮助用户深入理解。</think>### 自底向上构建知识图谱的方法、步骤及实现细节 自底向上构建知识图谱是一种从非结构化或半结构化数据中逐步抽取、整合和结构化知识的流程,其核心是通过迭代优化实现知识体系的扩展与完善。以下是具体方法和步骤: --- #### **1. 信息抽取** **目标**:从原始数据(文本、表格、图像等)中提取实体、关系、属性等知识要素。 **关键步骤**: - **实体识别(NER)**:使用自然语言处理技术(如BERT、BiLSTM-CRF)识别文本中的命名实体(如人名、地点、机构等)。例如,从“苹果公司市值突破3万亿美元”中提取实体“苹果公司”。 - **关系抽取**:通过模式匹配、监督学习或远程监督方法,提取实体间的语义关系。例如,从“马云创立阿里巴巴”中提取关系`创始人(马云, 阿里巴巴)`[^2]。 - **属性抽取**:识别实体的特征属性,如“成立时间”“总部地点”等。例如,从“特斯拉成立于2003年”中提取属性`成立时间(特斯拉, 2003)`。 **实现细节**: - 工具:SpaCy、StanfordNLP、OpenIE。 - 挑战:数据噪声、语言歧义(如“苹果”可能指水果或公司)[^3]。 --- #### **2. 知识融合** **目标**:消除异构数据中的歧义,整合多源知识。 **关键步骤**: - **实体链接(Entity Linking)**:将提取的实体与知识库(如Wikidata、DBpedia)中的标准实体对齐。例如,将“苹果”链接到`苹果公司(Q312)`而非`苹果(水果,Q89)`。 - **知识合并**:融合来自不同数据源的知识,解决冲突(如“成立时间”不一致时,通过可信度投票选择)。 - **冲突消解**:基于规则或统计模型(如贝叶斯网络)解决属性或关系的矛盾。 **实现细节**: - 工具:Apache Jena、Dedupe(去重库)。 - 算法:基于图嵌入(如TransE)的实体对齐[^1]。 --- #### **3. 知识加工** **目标**:构建结构化、网络化的知识体系,并补充隐含知识。 **关键步骤**: - **本体构建**:定义概念层次(如“公司”是“组织”的子类)、关系约束(如“创始人”的域和范围)。 - **知识推理**:通过规则引擎(如Drools)或图神经网络(如GNN)推导隐含关系。例如,从`创始人(A, B)`和`母公司(B, C)`可推出`母公司(A, C)`。 - **质量评估**:校验知识的准确性(如通过人工抽样)和一致性(如逻辑冲突检测)。 **实现细节**: - 工具:Protégé(本体编辑)、Neo4j(图数据库)。 - 优化:引入领域专家参与本体设计。 --- #### **4. 迭代更新** 自底向上方法的核心是持续迭代: 1. **增量更新**:根据新数据动态扩展知识库(如新增实体“ChatGPT”)。 2. **反馈优化**:通过用户查询日志发现知识缺失或错误,触发重新抽取或修正。 **技术支撑**: - 分布式计算框架(如Apache Spark)处理大规模数据。 - 版本控制(如Git)管理知识库变更[^2]。 --- ### **实现案例** 以构建“科技公司知识图谱”为例: 1. **信息抽取**:从新闻中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值