Esempio n. 1
0
        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));
                }
            }
        }
Esempio n. 2
0
 public EntityModel(string name)
 {
     this.model  = EntityModelTemplate.characters.First(x => x.Name.Equals(name));
     this.Health = model.MaxHealth;
 }