public IActionResult Index() { //Obtenemos la URL de la entidad string url = Request.GetEncodedUrl(); //string url = Request.GetDisplayUrl(); string urlParam = HttpUtility.ParseQueryString(Request.QueryString.Value).Get("url"); if (!string.IsNullOrEmpty(urlParam)) { url = urlParam; } ViewBag.UrlHome = mConfigService.GetUrlHome(); //Customizamos Header if (!string.IsNullOrEmpty(mConfigService.GetConstrainedByUrl())) { HttpContext.Response.Headers.Add("Link", "<http://www.w3.org/ns/ldp#BasicContainer>; rel=\"type\", <http://www.w3.org/ns/ldp#Resource>; rel=\"type\", <" + mConfigService.GetConstrainedByUrl() + ">; rel=\"http://www.w3.org/ns/ldp#constrainedBy\""); } else { HttpContext.Response.Headers.Add("Link", "<http://www.w3.org/ns/ldp#BasicContainer>; rel=\"type\", <http://www.w3.org/ns/ldp#Resource>; rel=\"type\""); } HashSet <string> methodsAvailable = new HashSet <string>() { "GET", "HEAD", "OPTIONS" }; HttpContext.Response.Headers.Add("allow", string.Join(", ", methodsAvailable)); if (!methodsAvailable.Contains(Request.HttpContext.Request.Method)) { return(StatusCode(StatusCodes.Status405MethodNotAllowed)); } //Cargamos la ontología RohGraph ontologyGraph = LoadGraph(mConfigService.GetOntologyGraph()); SparqlResultSet sparqlResultSetNombresPropiedades = (SparqlResultSet)ontologyGraph.ExecuteQuery(@"select distinct ?entidad ?nombre lang(?nombre) as ?lang where { ?entidad <http://www.w3.org/2000/01/rdf-schema#label> ?nombre. }"); //Guardamos todos los nombres de las propiedades en un diccionario Dictionary <string, string> communNamePropierties = new Dictionary <string, string>(); foreach (SparqlResult sparqlResult in sparqlResultSetNombresPropiedades.Results) { string entity = sparqlResult["entidad"].ToString(); if (!communNamePropierties.ContainsKey(entity)) { List <SparqlResult> filas = sparqlResultSetNombresPropiedades.Results.Where(x => x["entidad"].ToString() == entity).ToList(); if (filas.FirstOrDefault(x => x["lang"].ToString() == "es") != null) { communNamePropierties[entity] = ((LiteralNode)filas.FirstOrDefault(x => x["lang"].ToString() == "es")["nombre"]).Value.ToString(); } else if (filas.FirstOrDefault(x => x["lang"].ToString() == "en") != null) { communNamePropierties[entity] = ((LiteralNode)filas.FirstOrDefault(x => x["lang"].ToString() == "en")["nombre"]).Value.ToString(); } else if (filas.FirstOrDefault(x => string.IsNullOrEmpty(x["lang"].ToString())) != null) { communNamePropierties[entity] = ((LiteralNode)filas.FirstOrDefault(x => string.IsNullOrEmpty(x["lang"].ToString()))["nombre"]).Value.ToString(); } } } //Cargamos las entidades propias Dictionary <string, string> entitiesNames; Dictionary <string, SparqlObject> sparqlObjectDictionary = GetEntityData(url, out entitiesNames); if (sparqlObjectDictionary.Count == 1 && sparqlObjectDictionary[url].results.bindings.Count == 0) { //No existe la entidad HttpContext.Response.StatusCode = 404; ViewData["Title"] = "Error 404 página no encontrada para la entidad " + url; ViewData["NameTitle"] = mConfigService.GetNameTitle(); return(View(new EntityModelTemplate())); } else { //Cargamos los datos en un grafo en Local RohGraph dataGraph = new RohGraph(); createDataGraph(url, new List <string>(), false, dataGraph, sparqlObjectDictionary); //Generamos el RDF System.IO.StringWriter sw = new System.IO.StringWriter(); RdfXmlWriter rdfXmlWriter = new RdfXmlWriter(); rdfXmlWriter.Save(dataGraph, sw); string rdf = sw.ToString(); Microsoft.Extensions.Primitives.StringValues stringvalues; HttpContext.Request.Headers.TryGetValue("accept", out stringvalues); if (stringvalues == "application/rdf+xml") { //Añadimos la etiquetqa ETag al header using (SHA256 sha256Hash = SHA256.Create()) { string etag = GetHash(sha256Hash, rdf); string ifNoneMatch = HttpContext.Request.Headers["If-None-Match"]; if (ifNoneMatch == etag) { HttpContext.Response.StatusCode = 304; } HttpContext.Response.Headers.Add("ETag", etag); } //Devolvemos en formato RDF return(File(Encoding.UTF8.GetBytes(rdf), "application/rdf+xml")); } else { RohRdfsReasoner reasoner = new RohRdfsReasoner(); reasoner.Initialise(ontologyGraph); RohGraph dataInferenceGraph = dataGraph.Clone(); reasoner.Apply(dataInferenceGraph); //Obtenemos datos del resto de grafos (para los provenance) Dictionary <string, List <Dictionary <string, SparqlObject.Data> > > sparqlObjectDictionaryGraphs = GetEntityDataGraphs(url); //Obtenemos las tablas configuradas List <Table> dataTables = GetDataTables(dataInferenceGraph, url); //Obtenemos los arborGrah configurados List <ArborGraph> dataArborGrahs = GetDataArborGraphs(dataInferenceGraph, dataGraph, url); //Obtenemos las 10 primeras entidades que apuntan a la entidad HashSet <string> inverseEntities = new HashSet <string>(); SparqlResultSet sparqlRdfType = (SparqlResultSet)dataInferenceGraph.ExecuteQuery("select distinct ?o where {<" + url + "> a ?o. }"); HashSet <string> rdfTypesEntity = new HashSet <string>(); foreach (SparqlResult sparqlResult in sparqlRdfType.Results) { rdfTypesEntity.Add(sparqlResult["o"].ToString()); } if (mLinked_Data_Server_Config.ExcludeRelatedEntity.Intersect(rdfTypesEntity).Count() == 0) { inverseEntities = GetInverseEntities(dataGraph, new HashSet <string>() { url }, new HashSet <string>(sparqlObjectDictionary.Keys), new Dictionary <string, SparqlObject>(), 10); } //Devolvemos en formato HTML List <String> allEntities = new List <string>(); SparqlResultSet sparqlResultSetEntidades = (SparqlResultSet)dataGraph.ExecuteQuery("select distinct ?p ?o where { ?s ?p ?o. FILTER (!isBlank(?o)) }"); foreach (SparqlResult sparqlResult in sparqlResultSetEntidades.Results) { if ((sparqlResult["o"] is UriNode) && (sparqlResult["p"].ToString() != "http://www.w3.org/1999/02/22-rdf-syntax-ns#type")) { allEntities.Add(sparqlResult["o"].ToString()); } } //Preparamos el modelo de la entidad principal List <LinkedDataRdfViewModel> modelEntities = new List <LinkedDataRdfViewModel>(); LinkedDataRdfViewModel entidad = createLinkedDataRdfViewModel(url, dataGraph, sparqlObjectDictionaryGraphs, new List <string>(), allEntities, communNamePropierties, entitiesNames); modelEntities.Add(entidad); KeyValuePair <string, List <string> > titulo = entidad.stringPropertiesEntity.FirstOrDefault(x => mLinked_Data_Server_Config.PropsTitle.Contains(x.Key)); ViewData["Title"] = "About: " + url; if (titulo.Key != null) { ViewData["Title"] = "About: " + titulo.Value[0]; } ViewData["NameTitle"] = mConfigService.GetNameTitle(); //Preparamos el modelo del resto de entidades foreach (string entity in inverseEntities) { LinkedDataRdfViewModel entidadInversa = createLinkedDataRdfViewModel(entity, dataGraph, null, new List <string>(), allEntities, communNamePropierties, entitiesNames); modelEntities.Add(entidadInversa); } EntityModelTemplate entityModel = new EntityModelTemplate(); entityModel.linkedDataRDF = modelEntities; entityModel.propsTransform = mLinked_Data_Server_Config.PropsTransform; entityModel.tables = dataTables; entityModel.arborGraphs = dataArborGrahs; //Añadimos la etiquetqa ETag al header using (SHA256 sha256Hash = SHA256.Create()) { string stringToHash = JsonConvert.SerializeObject(entityModel.linkedDataRDF); stringToHash += JsonConvert.SerializeObject(entityModel.propsTransform); stringToHash += JsonConvert.SerializeObject(entityModel.tables); stringToHash += JsonConvert.SerializeObject(entityModel.arborGraphs); string etag = GetHash(sha256Hash, stringToHash); string ifNoneMatch = HttpContext.Request.Headers["If-None-Match"]; if (ifNoneMatch == etag) { HttpContext.Response.StatusCode = 304; } HttpContext.Response.Headers.Add("ETag", etag); } return(View(entityModel)); } } }
public EntityModel(string name) { this.model = EntityModelTemplate.characters.First(x => x.Name.Equals(name)); this.Health = model.MaxHealth; }