public void TestGetNodeIncomingAndOutgoingNodes()
        {
            var graph = new RDFExplorerGraph()
            {
                nodes = new[]
                {
                    new Node(0, "?var0"),
                    new Node(1, "?var1"),
                    new Node(2, "?var2"),
                },
                edges = new[]
                {
                    new Edge(0, "?prop0", 0, 1),
                    new Edge(1, "?prop0", 1, 2)
                },
            };
            var queryGraph = new QueryGraph(graph);
            var node0      = queryGraph.Nodes[0];
            var node1      = queryGraph.Nodes[1];
            var node2      = queryGraph.Nodes[2];

            Assert.Single(node1.GetIncomingNodes(queryGraph));
            Assert.Equal(node0, node1.GetIncomingNodes(queryGraph).First());

            Assert.Single(node1.GetOutgoingNodes(queryGraph));
            Assert.Equal(node2, node1.GetOutgoingNodes(queryGraph).First());
        }
        public void TestGetInstanceOfEdges()
        {
            var graph = new RDFExplorerGraph()
            {
                nodes = new[]
                {
                    new Node(0, "?var0"),
                    new Node(1, "?var1", new[] { "http://www.wikidata.org/entity/Q5" }),
                },
                edges = new[]
                {
                    new Edge(0, "?prop0", 0, 1, new [] { "http://www.wikidata.org/prop/direct/P31" })
                },
            };
            var queryGraph       = new QueryGraph(graph);
            var node0            = queryGraph.Nodes[0];
            var instanceOfEdges0 = node0.GetInstanceOfEdges(queryGraph).ToArray();

            Assert.Single(instanceOfEdges0);
            Assert.Equal(0, instanceOfEdges0[0].id);

            var node1            = queryGraph.Nodes[1];
            var instanceOfEdges1 = node1.GetInstanceOfEdges(queryGraph).ToArray();

            Assert.Empty(instanceOfEdges1);
        }
        public void TestSparql_2ConnectedNodes_3_SubjectIsGivenType_EdgeVar_2Nodes1Edge()
        {
            var graph = new RDFExplorerGraph()
            {
                nodes = new[]
                {
                    new Node(0, "?var0", new[] { "http://www.wikidata.org/entity/Q76" }),
                    new Node(1, "?var1"),
                },
                edges = new[]
                {
                    new Edge(0, "?prop0", 0, 1)
                },
            };
            var queryGraph         = new QueryGraph(graph);
            var sparql             = queryGraph.Nodes[1].ToSparql(queryGraph);
            var expectedStatements = new[]
            {
                @"<http://www.wikidata.org/entity/Q76> ?prop0 ?var1 .",
            };

            foreach (var statement in expectedStatements)
            {
                Assert.Contains(statement, sparql.ToString());
            }
        }
Exemple #4
0
        public QueryGraph(RDFExplorerGraph rdfGraph)
        {
            Nodes = new SortedDictionary <int, QueryNode>(rdfGraph.nodes.Distinct()
                                                          .ToDictionary(x => x.id, x => new QueryNode(x)));
            Edges = new SortedDictionary <int, QueryEdge>(rdfGraph.edges.Distinct()
                                                          .ToDictionary(x => x.id, x => new QueryEdge(x)));

            this.CheckNodeTypes();
        }
        public void TestTypes_3ConnectedNodes_2_N0InstanceOfN1_E1RangeN0_3Nodes2Edge()
        {
            var(EntitiesIndexPath, PropertiesIndexPath) = TestHelper.CreateIndexPaths(filename,
                                                                                      BaseEntitiesIndexPath, BasePropertiesIndexPath);
            var graph = new RDFExplorerGraph
            {
                nodes = new[] {
                    new Node(0, "?var0"),
                    new Node(1, "?var1", new[] { "http://www.wikidata.org/entity/Q5" }),
                    new Node(2, "?var2")
                },
                edges = new[] {
                    new Edge(0, "?prop0", 0, 1, new[] { "http://www.wikidata.org/prop/direct/P31" }),
                    new Edge(1, "?prop1", 2, 0)
                }
            };

            // Arrange
            var queryGraph = new QueryGraph(graph);

            //Act
            queryGraph.SetIndexPaths(EntitiesIndexPath, PropertiesIndexPath);
            queryGraph.SetTypesDomainsAndRanges(InMemoryQueryEngine);

            //Assert
            Assert.Empty(queryGraph.Nodes[0].Types);
            Assert.NotEmpty(queryGraph.Nodes[0].InferredTypes);
            Assert.NotEmpty(queryGraph.Nodes[0].ParentTypes); //InstanceOf Q5

            Assert.Single(queryGraph.Nodes[0].ParentTypes);
            Assert.Contains("Q5", queryGraph.Nodes[0].ParentTypes);
            Assert.Single(queryGraph.Nodes[0].InferredTypes);
            Assert.Contains("Q5", queryGraph.Nodes[0].InferredTypes);

            Assert.NotEmpty(queryGraph.Nodes[1].Types);
            Assert.Empty(queryGraph.Nodes[1].InferredTypes);
            Assert.Empty(queryGraph.Nodes[1].ParentTypes);

            Assert.Single(queryGraph.Nodes[1].Types);
            Assert.Contains("Q5", queryGraph.Nodes[1].Types);

            Assert.Empty(queryGraph.Nodes[2].Types);
            Assert.Empty(queryGraph.Nodes[2].InferredTypes);
            Assert.Empty(queryGraph.Nodes[2].ParentTypes);

            Assert.NotEmpty(queryGraph.Edges[0].DomainTypes);       //Domain of P31
            Assert.NotEmpty(queryGraph.Edges[0].RangeTypes);        //Range of P31

            Assert.Single(queryGraph.Edges[0].DomainTypes);         //Domain of P31 or just Q5?
            Assert.Contains("Q5", queryGraph.Edges[0].DomainTypes); //Domain of P31 or just Q5?

            Assert.Empty(queryGraph.Edges[1].DomainTypes);          //Domain of P31
            Assert.NotEmpty(queryGraph.Edges[1].RangeTypes);        //Range of P31

            Assert.Single(queryGraph.Edges[1].RangeTypes);          //Range of P31
            Assert.Contains("Q5", queryGraph.Edges[1].RangeTypes);  //Range of P31
        }
Exemple #6
0
        public IActionResult Run([FromBody] RDFExplorerGraph graph)
        {
            _logger.Info("Query Start:");
            _logger.Info($"Incoming Graph: {graph}");
            var queryGraph = new QueryGraph(graph);

            StaticQueryGraphResults.QueryGraphResults.GetGraphQueryResults(queryGraph, LuceneDirectoryDefaults.EntityIndexPath, LuceneDirectoryDefaults.PropertyIndexPath);
            _logger.Info("Query End");
            return(Json(queryGraph));
        }
        public void TestTypes_Inferred_3ConnectedNodes_N0P25N1_N1P27N2_E1DomainP25RangeP27_3Nodes3Edges()
        {
            var(EntitiesIndexPath, PropertiesIndexPath) = TestHelper.CreateIndexPaths(filename,
                                                                                      BaseEntitiesIndexPath, BasePropertiesIndexPath);
            var graph = new RDFExplorerGraph
            {
                nodes = new[] {
                    new Node(0, "?mother"),
                    new Node(1, "?son"),
                    new Node(2, "?country")
                },
                edges = new[] {
                    new Edge(0, "?motherOf", 0, 1, new[] { "http://www.wikidata.org/prop/direct/P25" }),
                    new Edge(1, "?fromCountry", 1, 2, new[] { "http://www.wikidata.org/prop/direct/P27" }),
                    new Edge(2, "?propDomainRange", 0, 2)
                }
            };

            // Arrange
            var queryGraph = new QueryGraph(graph);

            //Act
            queryGraph.SetIndexPaths(EntitiesIndexPath, PropertiesIndexPath);
            queryGraph.SetTypesDomainsAndRanges(InMemoryQueryEngine);

            //Assert
            Assert.Equal(2, queryGraph.Nodes[0].InferredTypes.Count);
            Assert.Contains("Q5", queryGraph.Nodes[0].InferredTypes);

            //Intersect
            Assert.Single(queryGraph.Nodes[1].InferredTypes);
            Assert.Contains("Q5", queryGraph.Nodes[1].InferredTypes);

            Assert.Single(queryGraph.Nodes[2].InferredTypes);
            Assert.Contains("Q6256", queryGraph.Nodes[2].InferredTypes);

            Assert.Equal(2, queryGraph.Edges[0].DomainTypes.Count);
            Assert.Contains("Q5", queryGraph.Edges[0].DomainTypes);
            Assert.Single(queryGraph.Edges[0].RangeTypes);
            Assert.Contains("Q5", queryGraph.Edges[0].RangeTypes);

            Assert.Single(queryGraph.Edges[1].DomainTypes);
            Assert.Contains("Q5", queryGraph.Edges[1].DomainTypes);
            Assert.Single(queryGraph.Edges[1].RangeTypes);
            Assert.Contains("Q6256", queryGraph.Edges[1].RangeTypes);

            Assert.Equal(2, queryGraph.Edges[2].DomainTypes.Count);
            Assert.Contains("Q5", queryGraph.Edges[2].DomainTypes);
            Assert.Single(queryGraph.Edges[2].RangeTypes);
            Assert.Contains("Q6256", queryGraph.Edges[2].RangeTypes);
        }
        public void TestGetNodeInstanceOfValues()
        {
            var graph = new RDFExplorerGraph()
            {
                nodes = new[]
                {
                    new Node(0, "?var0"),
                    new Node(1, "?var1", new[] { "http://www.wikidata.org/entity/Q5" }),
                },
                edges = new[]
                {
                    new Edge(0, "?prop0", 0, 1, new [] { "http://www.wikidata.org/prop/direct/P31" })
                },
            };
            var queryGraph = new QueryGraph(graph);
            var node0      = queryGraph.Nodes[0];

            Assert.Equal(new[] { "Q5" }, node0.GetInstanceOfValues(queryGraph).ToArray());
        }
        public void TestTypes_Inferred_3ConnectedNodes_N0P25N1_E1RangeP25_3Nodes2Edge()
        {
            var(EntitiesIndexPath, PropertiesIndexPath) = TestHelper.CreateIndexPaths(filename,
                                                                                      BaseEntitiesIndexPath, BasePropertiesIndexPath);
            var graph = new RDFExplorerGraph
            {
                nodes = new[] {
                    new Node(0, "?mother"),
                    new Node(1, "?son"),
                    new Node(2, "?var2")
                },
                edges = new[] {
                    new Edge(0, "?motherOf", 0, 1, new[] { "http://www.wikidata.org/prop/direct/P25" }),
                    new Edge(1, "?propRangeP25", 2, 0)
                }
            };

            // Arrange
            var queryGraph = new QueryGraph(graph);

            //Act
            queryGraph.SetIndexPaths(EntitiesIndexPath, PropertiesIndexPath);
            queryGraph.SetTypesDomainsAndRanges(InMemoryQueryEngine);

            //Assert
            Assert.Equal(2, queryGraph.Nodes[0].InferredTypes.Count);
            Assert.Contains("Q5", queryGraph.Nodes[0].InferredTypes);

            Assert.Equal(5, queryGraph.Nodes[1].InferredTypes.Count);
            Assert.Contains("Q5", queryGraph.Nodes[1].InferredTypes);

            Assert.Empty(queryGraph.Nodes[2].InferredTypes);

            Assert.Equal(2, queryGraph.Edges[0].DomainTypes.Count);
            Assert.Contains("Q5", queryGraph.Edges[0].DomainTypes);
            Assert.Equal(5, queryGraph.Edges[0].RangeTypes.Count);
            Assert.Contains("Q5", queryGraph.Edges[0].RangeTypes);

            //Since E1 source is HUMAN, Domain HUMAN
            Assert.Empty(queryGraph.Edges[1].DomainTypes);
            Assert.Equal(2, queryGraph.Edges[1].RangeTypes.Count);
            Assert.Contains("Q5", queryGraph.Edges[1].RangeTypes);
        }
        public void TestTypes_2ConnectedNodes_4_SubjectIsInstanceOfType_2Nodes1Edge()
        {
            var(EntitiesIndexPath, PropertiesIndexPath) = TestHelper.CreateIndexPaths(filename,
                                                                                      BaseEntitiesIndexPath, BasePropertiesIndexPath);
            var graph = new RDFExplorerGraph
            {
                nodes = new[] {
                    new Node(0, "?var0"),
                    new Node(1, "?var1", new[] { "http://www.wikidata.org/entity/Q5" })
                },
                edges = new[] {
                    new Edge(0, "?prop0", 0, 1, new[] { "http://www.wikidata.org/prop/direct/P31" })
                }
            };
            // Arrange
            var queryGraph = new QueryGraph(graph);

            //Act
            queryGraph.SetIndexPaths(EntitiesIndexPath, PropertiesIndexPath);
            queryGraph.SetTypesDomainsAndRanges(InMemoryQueryEngine);

            //Assert
            Assert.Empty(queryGraph.Nodes[0].Types);
            Assert.Empty(queryGraph.Nodes[0].InferredTypes);
            Assert.NotEmpty(queryGraph.Nodes[0].ParentTypes); //InstanceOf Q5

            Assert.Single(queryGraph.Nodes[0].ParentTypes);
            Assert.Contains("Q5", queryGraph.Nodes[0].ParentTypes);

            Assert.NotEmpty(queryGraph.Nodes[1].Types);
            Assert.Empty(queryGraph.Nodes[1].InferredTypes);
            Assert.Empty(queryGraph.Nodes[1].ParentTypes);

            Assert.Single(queryGraph.Nodes[1].Types);
            Assert.Contains("Q5", queryGraph.Nodes[1].Types);

            Assert.NotEmpty(queryGraph.Edges[0].DomainTypes); //Domain of P31
            Assert.NotEmpty(queryGraph.Edges[0].RangeTypes);  //Range of P31

            Assert.Single(queryGraph.Edges[0].DomainTypes);   //?human is type Q5. Domain should be Q5.
            Assert.Contains("Q5", queryGraph.Edges[0].DomainTypes);
        }
        public void TestTypes_2ConnectedNodes_3_SourceIsGivenType_TargetIsGivenType_E0N0P27E1_2Nodes1Edge()
        {
            var(EntitiesIndexPath, PropertiesIndexPath) = TestHelper.CreateIndexPaths(filename,
                                                                                      BaseEntitiesIndexPath, BasePropertiesIndexPath);
            var graph = new RDFExplorerGraph
            {
                nodes = new[] {
                    new Node(0, "?var0", new[] { "http://www.wikidata.org/entity/Q76" }),
                    new Node(1, "?var1", new[] { "http://www.wikidata.org/entity/Q30" })
                },
                edges = new[] {
                    new Edge(0, "?prop0", 0, 1, new[] { "http://www.wikidata.org/prop/direct/P27" })
                }
            };
            // Arrange
            var queryGraph = new QueryGraph(graph);

            //Act
            queryGraph.SetIndexPaths(EntitiesIndexPath, PropertiesIndexPath);
            queryGraph.SetTypesDomainsAndRanges(InMemoryQueryEngine);

            //Assert
            Assert.NotEmpty(queryGraph.Nodes[0].Types);         //Q76
            Assert.NotEmpty(queryGraph.Nodes[0].InferredTypes); //Domain P27
            Assert.NotEmpty(queryGraph.Nodes[0].ParentTypes);

            Assert.Single(queryGraph.Nodes[0].Types);
            Assert.Contains("Q76", queryGraph.Nodes[0].Types);
            Assert.Equal(2, queryGraph.Nodes[0].InferredTypes.Count);

            Assert.NotEmpty(queryGraph.Nodes[1].Types);         //Q30
            Assert.NotEmpty(queryGraph.Nodes[1].InferredTypes); //Range P27
            Assert.NotEmpty(queryGraph.Nodes[1].ParentTypes);

            Assert.Single(queryGraph.Nodes[1].Types);
            Assert.Contains("Q30", queryGraph.Nodes[1].Types);
            Assert.Single(queryGraph.Nodes[1].InferredTypes);

            Assert.NotEmpty(queryGraph.Edges[0].DomainTypes);
            Assert.NotEmpty(queryGraph.Edges[0].RangeTypes);
        }
        public void TestSparql_5ConnectedNodes_SiblingBrothersDirectorsOfMovies_5Nodes7Edge()
        {
            var graph = new RDFExplorerGraph()
            {
                nodes = new[]
                {
                    new Node(0, "?human0"),
                    new Node(1, "?human1"),
                    new Node(2, "?film2"),
                    new Node(3, "?HUMAN", new[] { "http://www.wikidata.org/entity/Q5" }),
                    new Node(4, "?FILM", new[] { "http://www.wikidata.org/entity/Q11424" }),
                },
                edges = new[]
                {
                    new Edge(0, "?instanceOfHuman0", 0, 3, new [] { "http://www.wikidata.org/prop/direct/P31" }),
                    new Edge(1, "?instanceOfHuman1", 1, 3, new [] { "http://www.wikidata.org/prop/direct/P31" }),
                    new Edge(2, "?instanceOfMovie2", 2, 4, new [] { "http://www.wikidata.org/prop/direct/P31" }),
                    new Edge(3, "?sibling0", 0, 1, new [] { "http://www.wikidata.org/prop/direct/P3373" }),
                    new Edge(4, "?sibling1", 1, 0, new [] { "http://www.wikidata.org/prop/direct/P3373" }),
                    new Edge(5, "?director0", 2, 0, new [] { "http://www.wikidata.org/prop/direct/P57" }),
                    new Edge(6, "?director1", 2, 1, new [] { "http://www.wikidata.org/prop/direct/P57" }),
                },
            };
            var queryGraph         = new QueryGraph(graph);
            var sparql             = queryGraph.Nodes[0].ToSparql(queryGraph);
            var expectedStatements = new[]
            {
                @"?human0 <http://www.wikidata.org/prop/direct/P31> <http://www.wikidata.org/entity/Q5> .",
                @"?human1 <http://www.wikidata.org/prop/direct/P31> <http://www.wikidata.org/entity/Q5> .",
                @"?film2 <http://www.wikidata.org/prop/direct/P31> <http://www.wikidata.org/entity/Q11424> .",
                @"?human0 <http://www.wikidata.org/prop/direct/P3373> ?human1 .",
                @"?human1 <http://www.wikidata.org/prop/direct/P3373> ?human0 .",
                @"?film2 <http://www.wikidata.org/prop/direct/P57> ?human0 .",
                @"?film2 <http://www.wikidata.org/prop/direct/P57> ?human1 .",
            };

            foreach (var statement in expectedStatements)
            {
                Assert.Contains(statement, sparql.ToString());
            }
        }
        public void TestTypes_Inferred_2ConnectedNodes_N0P25N1_N0DRP25N1_2Nodes2Edges()
        {
            var(EntitiesIndexPath, PropertiesIndexPath) = TestHelper.CreateIndexPaths(filename,
                                                                                      BaseEntitiesIndexPath, BasePropertiesIndexPath);
            var graph = new RDFExplorerGraph
            {
                nodes = new[] {
                    new Node(0, "?human"),
                    new Node(1, "?country")
                },
                edges = new[] {
                    new Edge(0, "?countryOfCitizenship", 0, 1, new[] { "http://www.wikidata.org/prop/direct/P27" }),
                    new Edge(1, "?propDomainRangeP27", 0, 1)
                }
            };

            // Arrange
            var queryGraph = new QueryGraph(graph);

            //Act
            queryGraph.SetIndexPaths(EntitiesIndexPath, PropertiesIndexPath);
            queryGraph.SetTypesDomainsAndRanges(InMemoryQueryEngine);

            //Assert
            Assert.Equal(2, queryGraph.Nodes[0].InferredTypes.Count);
            Assert.Contains("Q5", queryGraph.Nodes[0].InferredTypes);

            Assert.Single(queryGraph.Nodes[1].InferredTypes);
            Assert.Contains("Q6256", queryGraph.Nodes[1].InferredTypes);

            Assert.Equal(2, queryGraph.Edges[0].DomainTypes.Count);
            Assert.Contains("Q5", queryGraph.Edges[0].DomainTypes);
            Assert.Single(queryGraph.Edges[0].RangeTypes);
            Assert.Contains("Q6256", queryGraph.Edges[0].RangeTypes);

            Assert.Equal(2, queryGraph.Edges[1].DomainTypes.Count);
            Assert.Contains("Q5", queryGraph.Edges[1].DomainTypes);
            Assert.Single(queryGraph.Edges[1].RangeTypes);
            Assert.Contains("Q6256", queryGraph.Edges[1].RangeTypes);
        }
        public void TestGetEdgeSourceAndTargetNodes()
        {
            var graph = new RDFExplorerGraph()
            {
                nodes = new[]
                {
                    new Node(0, "?var0"),
                    new Node(1, "?var1", new[] { "http://www.wikidata.org/entity/Q5" }),
                },
                edges = new[]
                {
                    new Edge(0, "?prop0", 0, 1, new [] { "http://www.wikidata.org/prop/direct/P31" })
                },
            };
            var queryGraph = new QueryGraph(graph);
            var node0      = queryGraph.Nodes[0];
            var node1      = queryGraph.Nodes[1];
            var edge0      = queryGraph.Edges[0];

            Assert.Equal(node0, edge0.GetSourceNode(queryGraph));
            Assert.Equal(node1, edge0.GetTargetNode(queryGraph));
        }
        public static List <RDFExplorerGraph> GetGraphVariations(this RDFExplorerGraph graph)
        {
            var graphList = new List <RDFExplorerGraph> {
                graph
            };

            var edges = graph.edges;
            var nodes = graph.nodes;
            var count = edges.Count();

            for (var i = 0; i < Math.Pow(2, count); i++)
            {
                var newEdges = new List <Edge>();


                foreach (var edge in edges)
                {
                    var newEdge = new Edge(edge.id, edge.name, edge.sourceId, edge.targetId, edge.uris);
                    if ((newEdge.id & i) == 0)
                    {
                        newEdge = DisableEdge(newEdge);
                    }
                    newEdges.Add(newEdge);
                }

                var newGraph = new RDFExplorerGraph()
                {
                    nodes = nodes, edges = newEdges.ToArray()
                };

                if (!graphList.Any(x => x.ToString().Equals(newGraph.ToString())))
                {
                    graphList.Add(newGraph);
                }
            }

            return(graphList);
        }
        public void TestFromGraph()
        {
            var graph = new RDFExplorerGraph()
            {
                nodes = new[]
                {
                    new Node(0, "?var0", new[] { "http://www.wikidata.org/entity/Q76" }),
                    new Node(1, "?var1"),
                },
                edges = new[]
                {
                    new Edge(0, "?prop0", 0, 1)
                },
            };
            var queryGraph = new QueryGraph(graph);
            var query      = queryGraph.Nodes[1].ToSparql(queryGraph);

            var results = GraphApiQueries.RunQuery(query.ToString()).GetIds();

            foreach (var result in results)
            {
                Assert.True(result.StartsWith("Q") || result.StartsWith("P"));
            }
        }
        public void TestTypes_2ConnectedNodes_1_SourceIsGivenType_2Nodes1Edge()
        {
            var(EntitiesIndexPath, PropertiesIndexPath) = TestHelper.CreateIndexPaths(filename,
                                                                                      BaseEntitiesIndexPath, BasePropertiesIndexPath);
            var graph = new RDFExplorerGraph
            {
                nodes = new[] {
                    new Node(0, "?var0", new[] { "http://www.wikidata.org/entity/Q76" }),
                    new Node(1, "?var1")
                },
                edges = new[] {
                    new Edge(0, "?prop0", 0, 1)
                }
            };
            // Arrange
            var queryGraph = new QueryGraph(graph);

            //Act
            queryGraph.SetIndexPaths(EntitiesIndexPath, PropertiesIndexPath);
            queryGraph.SetTypesDomainsAndRanges(InMemoryQueryEngine);

            //Assert
            Assert.NotEmpty(queryGraph.Nodes[0].Types);
            Assert.NotEmpty(queryGraph.Nodes[0].InferredTypes); //InstanceOf Q76: Q5
            Assert.NotEmpty(queryGraph.Nodes[0].ParentTypes);

            Assert.Single(queryGraph.Nodes[0].Types);
            Assert.Contains("Q76", queryGraph.Nodes[0].Types);

            Assert.Empty(queryGraph.Nodes[1].Types);
            Assert.Empty(queryGraph.Nodes[1].InferredTypes);
            Assert.Empty(queryGraph.Nodes[1].ParentTypes);

            Assert.NotEmpty(queryGraph.Edges[0].DomainTypes); //InstanceOf Q76: Q5
            Assert.Empty(queryGraph.Edges[0].RangeTypes);
        }
        public void TestEqualGraphs()
        {
            // Arrange
            var graph1 = new RDFExplorerGraph
            {
                nodes = new[]
                {
                    new Node(0, "?varDomain0"),
                    new Node(1, "?varRange1")
                },
                edges = new[]
                {
                    new Edge(0, "?CountryOfCitizenship", 0, 1, new[] { "http://www.wikidata.org/prop/direct/P27" }),
                    new Edge(1, "?propDomainRange1", 0, 1)
                }
            };

            var graph2 = new RDFExplorerGraph
            {
                nodes = new[]
                {
                    new Node(0, "?varDomain0"),
                    new Node(1, "?varRange1")
                },
                edges = new[]
                {
                    new Edge(0, "?CountryOfCitizenship", 0, 1, new[] { "http://www.wikidata.org/prop/direct/P27" }),
                    new Edge(1, "?propDomainRange1", 0, 1)
                }
            };

            //Are equal:
            Assert.Equal(graph1, graph2);

            //Node: Change name
            graph1.nodes[0].name = "cambio";
            Assert.Equal(graph1, graph2);


            //Node: Change Id
            graph1.nodes[0].id = 2;
            Assert.NotEqual(graph1, graph2);
            graph1.nodes[0].id = 0;
            Assert.Equal(graph1, graph2);

            //Node: Change uris
            graph1.nodes[0].uris = new[] { "uri1" };
            Assert.NotEqual(graph1, graph2);
            graph1.nodes[0].uris = new string[] { };
            Assert.Equal(graph1, graph2);

            //Node: Add node
            graph1.nodes = graph1.nodes.ToList().Append(new Node {
                id = 2, name = "new"
            }).ToArray();
            Assert.NotEqual(graph1, graph2);
            graph1.nodes = graph1.nodes.ToList().Take(2).ToArray();
            Assert.Equal(graph1, graph2);

            //Node: Remove Node
            graph1.nodes = graph1.nodes.ToList().Take(1).ToArray();
            Assert.NotEqual(graph1, graph2);
            graph1.nodes = graph1.nodes.ToList().Append(new Node {
                id = 1, name = "?varRange1"
            }).ToArray();
            Assert.Equal(graph1, graph2);

            //Edge: Change name
            graph1.edges[0].name = "cambio";
            Assert.Equal(graph1, graph2);

            //Edge: change Id
            graph1.edges[0].id = 2;
            Assert.NotEqual(graph1, graph2);
            graph1.edges[0].id = 0;
            Assert.Equal(graph1, graph2);

            //Edge: change source Id
            graph1.edges[0].sourceId = 2;
            Assert.NotEqual(graph1, graph2);
            graph1.edges[0].sourceId = 0;
            Assert.Equal(graph1, graph2);

            //Edge: change target Id
            graph1.edges[0].targetId = 2;
            Assert.NotEqual(graph1, graph2);
            graph1.edges[0].targetId = 1;
            Assert.Equal(graph1, graph2);

            //Edge: Change uris
            graph1.edges[0].uris = new string[] { };
            Assert.NotEqual(graph1, graph2);
            graph1.edges[0].uris = new[] { "http://www.wikidata.org/prop/direct/P27", "http://www.wikidata.org/prop/direct/P27" };
            Assert.NotEqual(graph1, graph2);
            graph1.edges[0].uris = new[] { "http://www.wikidata.org/prop/direct/P27" };
            Assert.Equal(graph1, graph2);

            //Edge: Add node
            graph1.edges = graph1.edges.ToList().Append(new Edge {
                id = 2, name = "new"
            }).ToArray();
            Assert.NotEqual(graph1, graph2);
            graph1.edges = graph1.edges.ToList().Take(2).ToArray();
            Assert.Equal(graph1, graph2);

            //Edge: Remove Node
            graph1.edges = graph1.edges.ToList().Take(1).ToArray();
            Assert.NotEqual(graph1, graph2);
            graph1.edges = graph1.edges.ToList().Append(new Edge {
                id = 1, name = "?warever", sourceId = 0, targetId = 0
            }).ToArray();
            Assert.NotEqual(graph1, graph2);
            graph1.edges = graph1.edges.ToList().Take(1).ToArray();
            graph1.edges = graph1.edges.ToList().Append(new Edge {
                id = 1, name = "?warever", sourceId = 0, targetId = 1
            }).ToArray();
            Assert.Equal(graph1, graph2);

            ////Selected
            //graph1.selected = new Selected { id = 0, isNode = true };
            //Assert.Equal(graph1, graph2);
            //graph1.selected = new Selected { id = 1, isNode = false };
            //Assert.Equal(graph1, graph2);
        }
        public void TestTypes_4ConnectedNodes_N1InstanceOfN3_N2InstanceOfN4_N1E1N2_E1DomainN1RangeN2_4Nodes3Edge()
        {
            var(EntitiesIndexPath, PropertiesIndexPath) = TestHelper.CreateIndexPaths(filename,
                                                                                      BaseEntitiesIndexPath, BasePropertiesIndexPath);
            var graph = new RDFExplorerGraph
            {
                nodes = new[] {
                    new Node(0, "?human"),
                    new Node(1, "?country"),
                    new Node(2, "human", new[] { "http://www.wikidata.org/entity/Q5" }),
                    new Node(3, "country", new[] { "http://www.wikidata.org/entity/Q6256" })
                },
                edges = new[] {
                    new Edge(0, "?prop0", 0, 1),
                    new Edge(1, "?type1", 0, 2, new[] { "http://www.wikidata.org/prop/direct/P31" }),
                    new Edge(2, "?type2", 1, 3, new[] { "http://www.wikidata.org/prop/direct/P31" })
                }
            };

            // Arrange
            var queryGraph = new QueryGraph(graph);

            //Act
            queryGraph.SetIndexPaths(EntitiesIndexPath, PropertiesIndexPath);
            queryGraph.SetTypesDomainsAndRanges(InMemoryQueryEngine);

            //Assert
            //?human
            Assert.Empty(queryGraph.Nodes[0].Types);
            Assert.NotEmpty(queryGraph.Nodes[0].InferredTypes);
            Assert.NotEmpty(queryGraph.Nodes[0].ParentTypes); //InstanceOf Q5

            Assert.Single(queryGraph.Nodes[0].ParentTypes);
            Assert.Contains("Q5", queryGraph.Nodes[0].ParentTypes);
            Assert.Single(queryGraph.Nodes[0].InferredTypes);
            Assert.Contains("Q5", queryGraph.Nodes[0].InferredTypes);

            //?country
            Assert.Empty(queryGraph.Nodes[1].Types);
            Assert.NotEmpty(queryGraph.Nodes[1].InferredTypes);
            Assert.NotEmpty(queryGraph.Nodes[1].ParentTypes); //InstanceOf Q6256

            //HUMAN
            Assert.NotEmpty(queryGraph.Nodes[2].Types);
            Assert.Empty(queryGraph.Nodes[2].InferredTypes);
            Assert.Empty(queryGraph.Nodes[2].ParentTypes);

            Assert.Single(queryGraph.Nodes[2].Types);
            Assert.Contains("Q5", queryGraph.Nodes[2].Types);

            //COUNTRY
            Assert.NotEmpty(queryGraph.Nodes[3].Types);
            Assert.Empty(queryGraph.Nodes[3].InferredTypes);
            Assert.Empty(queryGraph.Nodes[3].ParentTypes);

            Assert.Single(queryGraph.Nodes[3].Types);
            Assert.Contains("Q6256", queryGraph.Nodes[3].Types);

            //?human -> ?country
            Assert.NotEmpty(queryGraph.Edges[0].DomainTypes);         //From the Domain of Q5
            Assert.NotEmpty(queryGraph.Edges[0].RangeTypes);          //From the Domain of Q6256

            Assert.Single(queryGraph.Edges[0].DomainTypes);           //From the Domain of Q5
            Assert.Contains("Q5", queryGraph.Edges[0].DomainTypes);   //From the Domain of Q5
            Assert.Single(queryGraph.Edges[0].RangeTypes);            //From the Domain of Q6256
            Assert.Contains("Q6256", queryGraph.Edges[0].RangeTypes); //From the Domain of Q6256

            //?human P31 HUMAN
            Assert.NotEmpty(queryGraph.Edges[1].DomainTypes);       //Domain of P31
            Assert.NotEmpty(queryGraph.Edges[1].RangeTypes);        //Range: Q5

            Assert.Single(queryGraph.Edges[1].DomainTypes);         //?human is type Q5. Domain should be Q5.
            Assert.Contains("Q5", queryGraph.Edges[1].DomainTypes); //Domain of P31

            //?country P31 COUNTRY
            Assert.NotEmpty(queryGraph.Edges[2].DomainTypes); //Domain of P31
            Assert.NotEmpty(queryGraph.Edges[2].RangeTypes);  //Range: Q6256

            Assert.Single(queryGraph.Edges[2].DomainTypes);   //?country is type Q6256. Domain should be Q6256.
            Assert.Contains("Q6256", queryGraph.Edges[2].DomainTypes);
        }