diff --git a/pom.xml b/pom.xml index eda21e0f..f2250793 100644 --- a/pom.xml +++ b/pom.xml @@ -38,7 +38,7 @@ 4.8 4.2.9 - 27.0 + 28.0 2.0.0 3.0.9 2.10.1 diff --git a/reasoner/catalog/openspg-catalog/src/main/scala/com/antgroup/openspg/reasoner/catalog/impl/PropertySchemaOps.scala b/reasoner/catalog/openspg-catalog/src/main/scala/com/antgroup/openspg/reasoner/catalog/impl/PropertySchemaOps.scala index 06be9d60..6e6d967e 100644 --- a/reasoner/catalog/openspg-catalog/src/main/scala/com/antgroup/openspg/reasoner/catalog/impl/PropertySchemaOps.scala +++ b/reasoner/catalog/openspg-catalog/src/main/scala/com/antgroup/openspg/reasoner/catalog/impl/PropertySchemaOps.scala @@ -15,7 +15,7 @@ package com.antgroup.openspg.reasoner.catalog.impl import scala.language.implicitConversions -import com.antgroup.openspg.core.schema.model.`type`.{BaseSPGType, BasicType, ConceptType, EntityType, EventType, SPGTypeEnum, StandardType} +import com.antgroup.openspg.core.schema.model.`type`._ import com.antgroup.openspg.reasoner.catalog.impl.struct.PropertyMeta import com.antgroup.openspg.reasoner.common.exception.KGValueException import com.antgroup.openspg.reasoner.common.types._ @@ -30,9 +30,15 @@ object PropertySchemaOps { case "CONCEPT" => KTConcept(propertySchema.getPropRange.getRangeEntityName) case "STANDARD" => - KTStd(propertySchema.getPropRange.getRangeEntityName, propertySchema.isSpreadable) + KTStd( + propertySchema.getPropRange.getRangeEntityName, + toKgType(propertySchema.getPropRange.getAttrRangeTypeEnum), + propertySchema.isSpreadable) case "PROPERTY" => - KTStd(propertySchema.getPropRange.getRangeEntityName, propertySchema.isSpreadable) + KTStd( + propertySchema.getPropRange.getRangeEntityName, + toKgType(propertySchema.getPropRange.getAttrRangeTypeEnum), + propertySchema.isSpreadable) case "ENTITY" => KTAdvanced(propertySchema.getPropRange.getRangeEntityName) case _ => throw KGValueException(s"unsupported type: ${propertySchema.getCategory}") @@ -49,7 +55,8 @@ object PropertySchemaOps { // todo KTAdvanced(eventType.getName) case standardType: StandardType => - KTStd(spgType.getName, standardType.getSpreadable) + // todo basicType support + KTStd(spgType.getName, null, standardType.getSpreadable) case basicType: BasicType => toKgType(basicType.getBasicType.name()) case _ => @@ -57,7 +64,7 @@ object PropertySchemaOps { } } - private def toKgType(basicType: String): KgType = { + private def toKgType(basicType: String): BasicKgType = { basicType.toUpperCase() match { case "INTEGER" => KTLong case "LONG" => KTLong diff --git a/reasoner/common/src/main/scala/com/antgroup/openspg/reasoner/common/types/KgType.scala b/reasoner/common/src/main/scala/com/antgroup/openspg/reasoner/common/types/KgType.scala index ad2762c5..b1631634 100644 --- a/reasoner/common/src/main/scala/com/antgroup/openspg/reasoner/common/types/KgType.scala +++ b/reasoner/common/src/main/scala/com/antgroup/openspg/reasoner/common/types/KgType.scala @@ -19,53 +19,57 @@ trait KgType { def isNullable: Boolean = false } -case object KTString extends KgType -case object KTCharacter extends KgType -case object KTInteger extends KgType -case object KTLong extends KgType -case object KTDouble extends KgType +trait BasicKgType extends KgType + +trait AdvancedKgType extends KgType + +case object KTString extends BasicKgType +case object KTCharacter extends BasicKgType +case object KTInteger extends BasicKgType +case object KTLong extends BasicKgType +case object KTDouble extends BasicKgType // corresponding to java object -case object KTObject extends KgType -case object KTDate extends KgType -case object KTBoolean extends KgType -case object KTParameter extends KgType +case object KTObject extends BasicKgType +case object KTDate extends BasicKgType +case object KTBoolean extends BasicKgType /** * list type * @param elementType element type */ -final case class KTList(elementType: KgType) extends KgType +final case class KTList(elementType: KgType) extends AdvancedKgType /** * array type * @param elementType element type */ -final case class KTArray(elementType: KgType) extends KgType +final case class KTArray(elementType: KgType) extends AdvancedKgType /** * Standard entity in Knowledge Graph. * @param label entity type name * @param spreadable is spreadable. */ -final case class KTStd(label: String, spreadable: Boolean) extends KgType +final case class KTStd(label: String, basicType: BasicKgType, spreadable: Boolean) + extends AdvancedKgType /** * Meta concept in Knowledge Graph. * @param label meta concept name */ -final case class KTConcept(label: String) extends KgType +final case class KTConcept(label: String) extends AdvancedKgType /** * Custom semantic type, which linked to entity in Knowledge Graph. * @param label entity type TODO add link function */ -final case class KTAdvanced(label: String) extends KgType +final case class KTAdvanced(label: String) extends AdvancedKgType /** * multi version property, default version number unit is ms * @param elementType */ -final case class KTMultiVersion(elementType: KgType) extends KgType +final case class KTMultiVersion(elementType: KgType) extends AdvancedKgType object KgType { diff --git a/reasoner/lube-logical/src/main/scala/com/antgroup/openspg/reasoner/lube/logical/ExprUtil.scala b/reasoner/lube-logical/src/main/scala/com/antgroup/openspg/reasoner/lube/logical/ExprUtil.scala index 9f70869b..670c4f90 100644 --- a/reasoner/lube-logical/src/main/scala/com/antgroup/openspg/reasoner/lube/logical/ExprUtil.scala +++ b/reasoner/lube-logical/src/main/scala/com/antgroup/openspg/reasoner/lube/logical/ExprUtil.scala @@ -91,7 +91,16 @@ object ExprUtil { } else { KTObject } - case UnaryOpExpr(GetField(name), Ref(alis)) => referVars(IRProperty(alis, name)) + case UnaryOpExpr(GetField(name), Ref(alis)) => + val kgType = referVars(IRProperty(alis, name)) + if (kgType.isInstanceOf[BasicKgType]) { + kgType + } else { + kgType match { + case KTStd(_, basicType, _) => basicType + case _ => KTObject + } + } case BinaryOpExpr(name, l, r) => name match { case BAnd | BEqual | BNotEqual | BGreaterThan | BNotGreaterThan | BSmallerThan | diff --git a/reasoner/lube-logical/src/main/scala/com/antgroup/openspg/reasoner/lube/logical/optimizer/rules/NodeIdToEdgeProperty.scala b/reasoner/lube-logical/src/main/scala/com/antgroup/openspg/reasoner/lube/logical/optimizer/rules/NodeIdToEdgeProperty.scala index f4b2dc7a..44e2bf00 100644 --- a/reasoner/lube-logical/src/main/scala/com/antgroup/openspg/reasoner/lube/logical/optimizer/rules/NodeIdToEdgeProperty.scala +++ b/reasoner/lube-logical/src/main/scala/com/antgroup/openspg/reasoner/lube/logical/optimizer/rules/NodeIdToEdgeProperty.scala @@ -20,7 +20,7 @@ import com.antgroup.openspg.reasoner.common.constants.Constants import com.antgroup.openspg.reasoner.common.exception.UnsupportedOperationException import com.antgroup.openspg.reasoner.common.graph.edge import com.antgroup.openspg.reasoner.common.types.KTString -import com.antgroup.openspg.reasoner.lube.block.{AddPredicate, DDLOp} +import com.antgroup.openspg.reasoner.lube.block.{AddPredicate, AddProperty, AddVertex, DDLOp} import com.antgroup.openspg.reasoner.lube.catalog.struct.Field import com.antgroup.openspg.reasoner.lube.common.expr.Expr import com.antgroup.openspg.reasoner.lube.common.graph.{IRField, IRNode, IRProperty, IRVariable} @@ -85,8 +85,10 @@ object NodeIdToEdgeProperty extends Rule { private def genField(direction: edge.Direction, fieldName: String): String = { (direction, fieldName) match { - case (edge.Direction.OUT, Constants.NODE_ID_KEY) => Constants.EDGE_TO_ID_KEY - case (edge.Direction.OUT, Constants.CONTEXT_LABEL) => Constants.EDGE_TO_ID_TYPE_KEY + case (edge.Direction.OUT | edge.Direction.BOTH, Constants.NODE_ID_KEY) => + Constants.EDGE_TO_ID_KEY + case (edge.Direction.OUT | edge.Direction.BOTH, Constants.CONTEXT_LABEL) => + Constants.EDGE_TO_ID_TYPE_KEY case (edge.Direction.IN, Constants.NODE_ID_KEY) => Constants.EDGE_FROM_ID_KEY case (edge.Direction.IN, Constants.CONTEXT_LABEL) => Constants.EDGE_FROM_ID_TYPE_KEY case (_, _) => @@ -124,31 +126,56 @@ object NodeIdToEdgeProperty extends Rule { private def projectUpdate(project: Project, map: Map[String, Object]): Project = { val exprMap = new mutable.HashMap[Var, Expr]() for (expr <- project.expr) { - val input = ExprUtils.getAllInputFieldInRule( - expr._2, - project.solved.getNodeAliasSet, - project.solved.getEdgeAliasSet) - val replaceVar = new mutable.HashMap[IRField, IRField] - for (irField <- input) { - if (irField.isInstanceOf[IRNode] && map.contains(irField.name)) { - for (propName <- irField.asInstanceOf[IRNode].fields) { - if (NODE_DEFAULT_PROPS.contains(propName)) { - val edgeInfo = map(irField.name).asInstanceOf[Connection] - replaceVar.put( - IRProperty(irField.name, propName), - IRProperty(edgeInfo.alias, genField(edgeInfo.direction, propName))) - replaceVar.put(IRVariable(irField.name), IRVariable(edgeInfo.alias)) - } + exprMap.put( + expr._1, + exprRewrite(expr._2, project.solved.getNodeAliasSet, project.solved.getEdgeAliasSet, map)) + } + project.copy(expr = exprMap.toMap) + } + + private def exprRewrite( + expr: Expr, + nodes: Set[String], + edges: Set[String], + map: Map[String, Object]): Expr = { + val input = ExprUtils.getAllInputFieldInRule(expr, nodes, edges) + val replaceVar = new mutable.HashMap[IRField, IRField] + for (irField <- input) { + if (irField.isInstanceOf[IRNode] && map.contains(irField.name)) { + for (propName <- irField.asInstanceOf[IRNode].fields) { + if (NODE_DEFAULT_PROPS.contains(propName)) { + val edgeInfo = map(irField.name).asInstanceOf[Connection] + replaceVar.put( + IRProperty(irField.name, propName), + IRProperty(edgeInfo.alias, genField(edgeInfo.direction, propName))) + replaceVar.put(IRVariable(irField.name), IRVariable(edgeInfo.alias)) } } } - if (replaceVar.isEmpty) { - exprMap.+=(expr) - } else { - exprMap.put(expr._1, ExprUtils.renameVariableInExpr(expr._2, replaceVar.toMap)) + } + if (replaceVar.isEmpty) { + expr + } else { + ExprUtils.renameVariableInExpr(expr, replaceVar.toMap) + } + } + + private def ddlUpdate(ddl: DDL, map: Map[String, Object]): DDL = { + val nodes = ddl.solved.getNodeAliasSet + val edges = ddl.solved.getEdgeAliasSet + val newOps = new mutable.HashSet[DDLOp]() + for (ddlOp <- ddl.ddlOp) { + ddlOp match { + case ddlOp: AddProperty => newOps.add(ddlOp) + case AddVertex(s, props) => + val newProps = props.map(p => (p._1, exprRewrite(p._2, nodes, edges, map))) + newOps.add(AddVertex(s, newProps)) + case AddPredicate(predicate) => + val newProps = predicate.fields.map(p => (p._1, exprRewrite(p._2, nodes, edges, map))) + newOps.add(AddPredicate(predicate.copy(fields = newProps))) } } - project.copy(expr = exprMap.toMap) + ddl.copy(ddlOp = newOps.toSet) } private def selectUpdate(select: Select, map: Map[String, Object]): Select = { @@ -172,40 +199,6 @@ object NodeIdToEdgeProperty extends Rule { select.copy(fields = newFields.toList) } - private def ddlUpdate(ddl: DDL, map: Map[String, Object]): DDL = { - val ddlOps = new mutable.HashSet[DDLOp]() - for (ddlOp <- ddl.ddlOp) { - ddlOp match { - case AddPredicate(predicate) => - val newFields = new mutable.HashMap[String, Expr]() - for (field <- predicate.fields) { - val input = ExprUtils.getAllInputFieldInRule(field._2, null, null) - val replaceVar = new mutable.HashMap[IRField, IRProperty] - for (irField <- input) { - if (irField.isInstanceOf[IRNode] && map.contains(irField.name)) { - for (propName <- irField.asInstanceOf[IRNode].fields) { - if (NODE_DEFAULT_PROPS.contains(propName)) { - val edgeInfo = map(irField.name).asInstanceOf[Connection] - replaceVar.put( - IRProperty(irField.name, propName), - IRProperty(edgeInfo.alias, genField(edgeInfo.direction, propName))) - } - } - } - } - if (replaceVar.isEmpty) { - newFields.put(field._1, field._2) - } else { - newFields.put(field._1, ExprUtils.renameVariableInExpr(field._2, replaceVar.toMap)) - } - } - ddlOps.add(AddPredicate(predicate.copy(fields = newFields.toMap))) - case _ => ddlOps.add(ddlOp) - } - } - ddl.copy(ddlOp = ddlOps.toSet) - } - private def targetConnection(expandInto: ExpandInto): Connection = { val alias = expandInto.pattern.root.alias val edgeAlias = expandInto.transform[Connection] { @@ -217,6 +210,12 @@ object NodeIdToEdgeProperty extends Rule { } else { targetConnection(alias, expandInto.pattern) } + case (linkedExpand: LinkedExpand, list) => + if (!list.isEmpty && list.head != null) { + list.head + } else { + targetConnection(alias, linkedExpand.edgePattern) + } case (_, list) => if (list.isEmpty) { null diff --git a/reasoner/lube-logical/src/main/scala/com/antgroup/openspg/reasoner/lube/logical/optimizer/rules/Pure.scala b/reasoner/lube-logical/src/main/scala/com/antgroup/openspg/reasoner/lube/logical/optimizer/rules/Pure.scala index ffc07115..d6c1c378 100644 --- a/reasoner/lube-logical/src/main/scala/com/antgroup/openspg/reasoner/lube/logical/optimizer/rules/Pure.scala +++ b/reasoner/lube-logical/src/main/scala/com/antgroup/openspg/reasoner/lube/logical/optimizer/rules/Pure.scala @@ -39,8 +39,8 @@ object Pure extends SimpleRule { val projects = select.refFields.map((_, Directly)).toMap select.withNewChildren(Array.apply(Project(in, projects, in.solved))) case project @ Project(in, _, _) => - if (in.isInstanceOf[Project] || in.isInstanceOf[ExpandInto] || in - .isInstanceOf[PatternScan] || in.isInstanceOf[BinaryLogicalOperator]) { + if (in.isInstanceOf[Project] || in.isInstanceOf[ExpandInto] || in.isInstanceOf[LinkedExpand] + || in.isInstanceOf[PatternScan] || in.isInstanceOf[BinaryLogicalOperator]) { project } else { val projectOutput: List[Var] = project.fields @@ -71,17 +71,20 @@ object Pure extends SimpleRule { } } - varMap.values.map(f => { - if (f.isInstanceOf[PathVar]) { - f - } else if (!solved.fields.contains(f.name)) { - throw InvalidRefVariable(s"can not find $f") - } else if (solved.fields.get(f.name).get.isInstanceOf[RepeatPathVar]) { - f.intersect(solved.fields.get(f.name).get.asInstanceOf[RepeatPathVar].pathVar.elements(1)) - } else { - f.intersect(solved.fields.get(f.name).get) - } - }).toList + varMap.values + .map(f => { + if (f.isInstanceOf[PathVar]) { + f + } else if (!solved.fields.contains(f.name)) { + throw InvalidRefVariable(s"can not find $f") + } else if (solved.fields.get(f.name).get.isInstanceOf[RepeatPathVar]) { + f.intersect( + solved.fields.get(f.name).get.asInstanceOf[RepeatPathVar].pathVar.elements(1)) + } else { + f.intersect(solved.fields.get(f.name).get) + } + }) + .toList } override def direction: Direction = Down diff --git a/reasoner/lube-logical/src/test/resources/TuringSchema.json b/reasoner/lube-logical/src/test/resources/TuringSchema.json deleted file mode 100644 index 08719d13..00000000 --- a/reasoner/lube-logical/src/test/resources/TuringSchema.json +++ /dev/null @@ -1,1678 +0,0 @@ -{ - "nodes": { - "MKG.AntPOI": { - "typeName": "MKG.AntPOI", - "nodeType": "ADVANCED", - "properties": [{ - "name": "dzdpId", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "mcc2Level2Namestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.MCC2" - }, - "resolved": true - }, { - "name": "gmtModified", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level2Namestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.POICategory" - }, - "resolved": true - }, { - "name": "shopList", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "MKG.MifShop", - "spreadable": false - }, - "resolved": true - }, { - "name": "bdId", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "cityName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level3Code", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "sourceCategoryL3", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "pidList", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "MKG.PartnerID", - "spreadable": false - }, - "resolved": true - }, { - "name": "countryName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "cityNamestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.AdministrativeArea" - }, - "resolved": true - }, { - "name": "address", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "mcc2Level1Name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "latitude", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTDouble$" - }, - "resolved": true - }, { - "name": "provinceName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "brandCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "MKG.Brand", - "spreadable": false - }, - "resolved": true - }, { - "name": "provinceCodestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "STD.AMapADCode", - "spreadable": true - }, - "resolved": true - }, { - "name": "qualityScore", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "provinceNamestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.AdministrativeArea" - }, - "resolved": true - }, { - "name": "villageCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "crowdSalaryLvl", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level2Code", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "mcc2Level2Code", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "apId", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "crowdFreqLvl", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "townCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "townName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "sourceCategoryL1", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level3Codestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "STD.AMapPOICategoryCode", - "spreadable": true - }, - "resolved": true - }, { - "name": "countyCodestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "STD.AMapADCode", - "spreadable": true - }, - "resolved": true - }, { - "name": "cityCodestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "STD.AMapADCode", - "spreadable": true - }, - "resolved": true - }, { - "name": "countryCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level2Codestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "STD.AMapPOICategoryCode", - "spreadable": true - }, - "resolved": true - }, { - "name": "commercialFlag", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "source", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "crowdIfoldLvl", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "creator", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level3Name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "mcc2Level1Namestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.MCC2" - }, - "resolved": true - }, { - "name": "avgPrice", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "mcc2Level2Codestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "STD.MCCCode", - "spreadable": true - }, - "resolved": true - }, { - "name": "openTime", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "sourceCategoryType", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "description", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level2Name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level3Namestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.POICategory" - }, - "resolved": true - }, { - "name": "longitude", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTDouble$" - }, - "resolved": true - }, { - "name": "level1Code", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "countryCodestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "STD.AMapADCode", - "spreadable": true - }, - "resolved": true - }, { - "name": "crowdOccupationLvl", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "countyCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "telephone", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "administrativeArea", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.AdministrativeArea" - }, - "resolved": true - }, { - "name": "aoiId", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "villageName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "isMainPOI", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "mcc2Level2Name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "belongAOIList", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "MKG.AntAOI", - "spreadable": false - }, - "resolved": true - }, { - "name": "delFlag", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "koubeiId", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "region", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "smidList", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "MKG.IndirectMerchant", - "spreadable": false - }, - "resolved": true - }, { - "name": "countyNamestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.AdministrativeArea" - }, - "resolved": true - }, { - "name": "qualityDegree", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "crowdCoverLvl", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "sourceCategoryL2", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "latLon", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "crowdloyaltyLvl", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "gmtCreated", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "elemeId", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "brandInfo", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "brandName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "alias", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "provinceCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "bizCodeList", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level1Name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level1Codestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "STD.AMapPOICategoryCode", - "spreadable": true - }, - "resolved": true - }, { - "name": "crowdKoubeiLvl", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "crowdPopularLvl", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "crowdScaleLvl", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "crowdIfonlineLvl", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "amapList", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "mcc2Level1Code", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "countryNamestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.AdministrativeArea" - }, - "resolved": true - }, { - "name": "mcc2Level1Codestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "STD.MCCCode", - "spreadable": true - }, - "resolved": true - }, { - "name": "regionstd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.AdministrativeArea" - }, - "resolved": true - }, { - "name": "crowdAgeLvl", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "shortAddress", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "qualityRank", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level1Namestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.POICategory" - }, - "resolved": true - }, { - "name": "countyName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "id", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "cityCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "joinStatus", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "MKG.AntAOI": { - "typeName": "MKG.AntAOI", - "nodeType": "ADVANCED", - "properties": [{ - "name": "isOpen", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "gmtModified", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "polygonType", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "area", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "polygonExt", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "cityName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "businessId", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level3Code", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "countryName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "cityNamestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.AdministrativeArea" - }, - "resolved": true - }, { - "name": "address", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "latitude", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTDouble$" - }, - "resolved": true - }, { - "name": "provinceName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "provinceNamestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.AdministrativeArea" - }, - "resolved": true - }, { - "name": "level2Code", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "townCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "townName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "shapeType", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "countryCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "remark", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "poiCategory", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.POICategory" - }, - "resolved": true - }, { - "name": "source", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "creator", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level3Name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "centerLat", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "description", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level2Name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "longitude", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTDouble$" - }, - "resolved": true - }, { - "name": "level1Code", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "countyCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "aoiId", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "coords", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "region", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.AdministrativeArea" - }, - "resolved": true - }, { - "name": "centerLng", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "countyNamestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.AdministrativeArea" - }, - "resolved": true - }, { - "name": "latLon", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "gmtCreated", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "provinceCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "bizCodeList", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level1Name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "pointNum", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "typeCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "radius", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "countryNamestd", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.AdministrativeArea" - }, - "resolved": true - }, { - "name": "countyName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "id", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "cityCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "TuringCore.TravelEvent": { - "typeName": "TuringCore.TravelEvent", - "nodeType": "EVENT", - "properties": [{ - "name": "travelEndpoint", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.AdministrativeArea" - }, - "resolved": true - }, { - "name": "name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "description", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "traveler", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "TuringCore.AlipayUser", - "spreadable": false - }, - "resolved": true - }, { - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "travelMode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "TuringCore.TravelMode" - }, - "resolved": true - }, { - "name": "eventTime", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTStd", - "label": "STD.Timestamp", - "spreadable": false - }, - "resolved": true - }, { - "name": "id", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "TuringCore.TravelMode": { - "typeName": "TuringCore.TravelMode", - "nodeType": "CONCEPT", - "properties": [{ - "name": "conceptCategory", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "description", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "alias", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "id", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "conceptAttribute", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "STD.MCCCode": { - "typeName": "STD.MCCCode", - "nodeType": "STANDARD", - "properties": [{ - "name": "description", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "id", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "CKG.POICategory": { - "typeName": "CKG.POICategory", - "nodeType": "CONCEPT", - "properties": [{ - "name": "stdId", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "conceptCategory", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "description", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "alias", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "id", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "conceptAttribute", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "CKG.MCC2": { - "typeName": "CKG.MCC2", - "nodeType": "CONCEPT", - "properties": [{ - "name": "stdId", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "conceptCategory", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "description", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "alias", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "id", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "conceptAttribute", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "CKG.AdministrativeArea": { - "typeName": "CKG.AdministrativeArea", - "nodeType": "CONCEPT", - "properties": [{ - "name": "stdId", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "cityName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "countryName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "provinceName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "version", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "parentName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "countryCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "conceptCategory", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "description", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "countyCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "parentCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "level", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "alias", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "provinceCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "code", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "countyName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "id", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "conceptAttribute", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "cityCode", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "shortName", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "STD.AMapPOICategoryCode": { - "typeName": "STD.AMapPOICategoryCode", - "nodeType": "STANDARD", - "properties": [{ - "name": "description", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "id", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "STD.AMapADCode": { - "typeName": "STD.AMapADCode", - "nodeType": "STANDARD", - "properties": [{ - "name": "description", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "id", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "TuringCore.AlipayUser": { - "typeName": "TuringCore.AlipayUser", - "nodeType": "ADVANCED", - "properties": [{ - "name": "name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "description", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "workLoc", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.AdministrativeArea" - }, - "resolved": true - }, { - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "id", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "TuringCrowd": { - "typeName": "TuringCrowd", - "nodeType": "ADVANCED", - "properties": [{ - "name": "name", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "description", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "workLoc", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTConcept", - "label": "CKG.AdministrativeArea" - }, - "resolved": true - }, { - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }, { - "name": "id", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - } - }, - "edges": { - "CKG.AdministrativeArea_isA_CKG.AdministrativeArea": { - "startNode": "CKG.AdministrativeArea", - "typeName": "isA", - "endNode": "CKG.AdministrativeArea", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "TuringCore.TravelEvent_traveler_TuringCore.AlipayUser": { - "startNode": "TuringCore.TravelEvent", - "typeName": "traveler", - "endNode": "TuringCore.AlipayUser", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "MKG.AntPOI_cityCodestd_STD.AMapADCode": { - "startNode": "MKG.AntPOI", - "typeName": "cityCodestd", - "endNode": "STD.AMapADCode", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "CKG.MCC2_isA_CKG.MCC2": { - "startNode": "CKG.MCC2", - "typeName": "isA", - "endNode": "CKG.MCC2", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "MKG.AntPOI_level1Codestd_STD.AMapPOICategoryCode": { - "startNode": "MKG.AntPOI", - "typeName": "level1Codestd", - "endNode": "STD.AMapPOICategoryCode", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "MKG.AntPOI_mcc2Level2Codestd_STD.MCCCode": { - "startNode": "MKG.AntPOI", - "typeName": "mcc2Level2Codestd", - "endNode": "STD.MCCCode", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "TuringCore.TravelMode_isA_TuringCore.TravelMode": { - "startNode": "TuringCore.TravelMode", - "typeName": "isA", - "endNode": "TuringCore.TravelMode", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "TuringCore.TravelEvent_travelEndpoint_CKG.AdministrativeArea": { - "startNode": "TuringCore.TravelEvent", - "typeName": "travelEndpoint", - "endNode": "CKG.AdministrativeArea", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "TuringCore.AlipayUser_workLoc_CKG.AdministrativeArea": { - "startNode": "TuringCore.AlipayUser", - "typeName": "workLoc", - "endNode": "CKG.AdministrativeArea", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "MKG.AntPOI_provinceCodestd_STD.AMapADCode": { - "startNode": "MKG.AntPOI", - "typeName": "provinceCodestd", - "endNode": "STD.AMapADCode", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "MKG.AntPOI_mcc2Level1Codestd_STD.MCCCode": { - "startNode": "MKG.AntPOI", - "typeName": "mcc2Level1Codestd", - "endNode": "STD.MCCCode", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "MKG.AntPOI_level3Codestd_STD.AMapPOICategoryCode": { - "startNode": "MKG.AntPOI", - "typeName": "level3Codestd", - "endNode": "STD.AMapPOICategoryCode", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "MKG.AntPOI_countyCodestd_STD.AMapADCode": { - "startNode": "MKG.AntPOI", - "typeName": "countyCodestd", - "endNode": "STD.AMapADCode", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "MKG.AntPOI_countryCodestd_STD.AMapADCode": { - "startNode": "MKG.AntPOI", - "typeName": "countryCodestd", - "endNode": "STD.AMapADCode", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "TuringCore.TravelEvent_travelMode_TuringCore.TravelMode": { - "startNode": "TuringCore.TravelEvent", - "typeName": "travelMode", - "endNode": "TuringCore.TravelMode", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "CKG.POICategory_isA_CKG.POICategory": { - "startNode": "CKG.POICategory", - "typeName": "isA", - "endNode": "CKG.POICategory", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - }, - "MKG.AntPOI_level2Codestd_STD.AMapPOICategoryCode": { - "startNode": "MKG.AntPOI", - "typeName": "level2Codestd", - "endNode": "STD.AMapPOICategoryCode", - "properties": [{ - "name": "__label__", - "kgType": { - "jsonClass": "com.antgroup.openspg.reasoner.common.types.KTString$" - }, - "resolved": true - }], - "resolved": true - } - } -} \ No newline at end of file diff --git a/reasoner/lube-logical/src/test/scala/com/antgroup/openspg/reasoner/lube/logical/ExprUtilTests.scala b/reasoner/lube-logical/src/test/scala/com/antgroup/openspg/reasoner/lube/logical/ExprUtilTests.scala index 83ebd1b0..4c9d7dfb 100644 --- a/reasoner/lube-logical/src/test/scala/com/antgroup/openspg/reasoner/lube/logical/ExprUtilTests.scala +++ b/reasoner/lube-logical/src/test/scala/com/antgroup/openspg/reasoner/lube/logical/ExprUtilTests.scala @@ -13,7 +13,7 @@ package com.antgroup.openspg.reasoner.lube.logical -import com.antgroup.openspg.reasoner.common.types.{KgType, KTBoolean, KTDouble, KTInteger, KTLong, KTString} +import com.antgroup.openspg.reasoner.common.types._ import com.antgroup.openspg.reasoner.lube.catalog.struct.Field import com.antgroup.openspg.reasoner.lube.common.expr.{Expr, Ref, UnaryOpExpr} import com.antgroup.openspg.reasoner.lube.common.graph.{IRField, IRProperty, IRVariable} @@ -76,4 +76,23 @@ class ExprUtilTests extends AnyFunSpec { ExprUtil.getTargetType(rule, map, udfRepo) should equal(KTLong) } + + it("test advanced type") { + val parser = new RuleExprParser() + val udfRepo = UdfMngFactory.getUdfMng + val map = Map + .apply(IRProperty("e", "eventTime") -> KTStd("STD.Timestamp", KTLong, false)) + .asInstanceOf[Map[IRField, KgType]] + + val r1 = ProjectRule( + IRVariable("eventDay"), + parser.parse("from_unix_time_ms(e.eventTime, 'yyyyMMdd')")) + + val r2 = ProjectRule( + IRVariable("timeInDay"), + parser.parse("from_unix_time_ms(e.eventTime, 'yyyyMMdd') in ['20240311', '20240312']")) + + ExprUtil.getTargetType(r1, map, udfRepo) should equal(KTString) + ExprUtil.getTargetType(r2, map, udfRepo) should equal(KTBoolean) + } } diff --git a/reasoner/lube-logical/src/test/scala/com/antgroup/openspg/reasoner/lube/logical/OptimizerTests.scala b/reasoner/lube-logical/src/test/scala/com/antgroup/openspg/reasoner/lube/logical/OptimizerTests.scala index 4db049e2..5499285a 100644 --- a/reasoner/lube-logical/src/test/scala/com/antgroup/openspg/reasoner/lube/logical/OptimizerTests.scala +++ b/reasoner/lube-logical/src/test/scala/com/antgroup/openspg/reasoner/lube/logical/OptimizerTests.scala @@ -63,101 +63,6 @@ class OptimizerTests extends AnyFunSpec { } } - it("testEdgeToProperty") { - val schema = ResourceLoader.loadResourceFile("TuringSchema.json") - val catalog = new JSONGraphCatalog(schema) - val dsl = - """ - |Define (user:TuringCore.AlipayUser)-[bt:belongTo]->(tc:`TuringCrowd`/`通勤用户`) { - | GraphStructure { - | (user) -[pwl:workLoc]-> (aa1:CKG.AdministrativeArea) - | (te:TuringCore.TravelEvent) -[ptler:traveler]-> (user) - | (te) -[ptm:travelMode]-> (tm:TuringCore.TravelMode) - | (te) -[pte:travelEndpoint]-> (aa1:CKG.AdministrativeArea) - | } - | Rule { - | R1('常驻地在杭州'): aa1.id == '中国-浙江省-杭州市' - | R2('工作日上班时间通勤用户'): dayOfWeek(te.eventTime) in [1, 2, 3, 4, 5] - | and hourOfDay(te.eventTime) in [6, 7, 8, 9, 10, 17, 18, 19, 20, 21] - | R3('公交地铁'): tm.id in ['bus', 'subway'] - | tmCount('出行次数') = group(user).count(te.id) - | R4('出行次数大于3次'): tmCount >= 3 - | } - |} - |""".stripMargin - catalog.init() - val parser = new OpenSPGDslParser() - val block = parser.parse(dsl) - implicit val context: LogicalPlannerContext = - LogicalPlannerContext(catalog, parser, Map.empty) - val logicalPlan = LogicalPlanner.plan(block).head - val finalOp = LogicalOptimizer.optimize( - logicalPlan, - Seq.apply(FilterPushDown, EdgeToProperty, SolvedModelPure)) - val qlTransformer = new Expr2QlexpressTransformer() - finalOp.findExactlyOne { case ExpandInto(_, _, pattern) => - qlTransformer.transform(pattern.getNode("te").rule).head should equal( - "((te.travelMode in [\"bus\",\"subway\"]) && ((dayOfWeek(te.eventTime) in [1,2,3,4,5]) && (hourOfDay(te.eventTime) in [6,7,8,9,10,17,18,19,20,21]))) && (te.travelEndpoint == \"中国-浙江省-杭州市\")") - } - finalOp.findExactlyOne { case PatternScan(_, pattern) => - qlTransformer.transform(pattern.getNode("user").rule).head should equal( - "user.workLoc == \"中国-浙江省-杭州市\"") - } - finalOp.findExactlyOne { case Start(_, _, _, solved) => - solved.alias2Types.keys.toSet should equal(Set.apply("user", "te", "ptler")) - solved.fields("user").asInstanceOf[NodeVar].fields.map(_.name) should equal( - Set.apply("workLoc")) - solved.fields("te").asInstanceOf[NodeVar].fields.map(_.name) should equal( - Set.apply("eventTime", "id", "travelMode", "travelEndpoint")) - } - } - - it("concept to property") { - val schema = ResourceLoader.loadResourceFile("TuringSchema.json") - val catalog = new JSONGraphCatalog(schema) - catalog.init() - val start = Start( - catalog.getGraph(Catalog.defaultGraphName), - null, - Set.empty, - SolvedModel( - Map.empty, - Map.apply( - ("te", NodeVar("te", Set.apply(new Field("eventTime", KTString, true)))), - ("user", NodeVar("user", Set.apply())), - ("tm", NodeVar("tm", Set.apply(new Field("id", KTString, true))))), - Map.empty)) - val r1 = LogicRule( - "R1", - "xx", - BinaryOpExpr(BEqual, UnaryOpExpr(GetField("eventTime"), Ref("te")), VString("1"))) - val r2 = LogicRule( - "R2", - "xx", - BinaryOpExpr(BEqual, UnaryOpExpr(GetField("id"), Ref("tm")), VString("bus"))) - val patternElementMap = Map.apply( - ("te", PatternElement("te", Set.apply("TuringCore.TravelEvent"), r1)), - ("tm", PatternElement("tm", Set.apply("TuringCore.TravelMode"), r2))) - val edges: Map[String, Set[Connection]] = Map.apply(( - "te", - Set.apply( - new PatternConnection("ptm", "te", Set.apply("travelMode"), "tm", Direction.OUT, null)))) - val expand = ExpandInto( - start, - patternElementMap("te"), - PartialGraphPattern("te", patternElementMap, edges)) - val logicalOp = - ExpandInto(expand, patternElementMap("tm"), NodePattern(patternElementMap("tm"))) - val finalOp = BottomUp[LogicalOperator](EdgeToProperty.rule(null)).transform(logicalOp) - - val qlTransformer = new Expr2QlexpressTransformer() - finalOp.findExactlyOne { case ExpandInto(_, _, pattern) => - pattern.root.alias should equal("te") - qlTransformer.transform(pattern.getNode("te").rule).head should equal( - "(te.travelMode == \"bus\") && (te.eventTime == \"1\")") - } - } - it("expandInto pure") { val dsl = """