Filter SPARQL-查找和/或筛选3人之间的关系

Filter SPARQL-查找和/或筛选3人之间的关系,filter,sparql,protege,Filter,Sparql,Protege,我有一个本体(内置Protege)和几个家庭成员。如下图所示,人与人之间可能存在良好(黄色)或不良(橙色)关系: 所有好的和坏的关系都是对称的 我试图找到所有人之间的“三角”关系。问题是我得到了太多的结果,我找不到一种方法来减少过滤函数的结果 我的SPARQL查询: SELECT * WHERE { { ?p1 g:hasGoodRel ?p2 . OPTIONAL {?p1 g:hasBadRel ?p3 . } OPTIONAL {?p2 g:hasBa

我有一个本体(内置Protege)和几个家庭成员。如下图所示,人与人之间可能存在良好(黄色)或不良(橙色)关系:

所有好的和坏的关系都是对称的

我试图找到所有人之间的“三角”关系。问题是我得到了太多的结果,我找不到一种方法来减少过滤函数的结果

我的SPARQL查询:

SELECT *
WHERE {
{
     ?p1 g:hasGoodRel ?p2 . 

     OPTIONAL {?p1 g:hasBadRel  ?p3 . }
     OPTIONAL {?p2 g:hasBadRel  ?p3 . }
    }
}
结果是:

:D  :C  :E  
:D  :D  :E  
:C  :D  :E  <-- 
:C  :D  :A  
:C  :B  :E  
:C  :B  :A  <--
:B  :C
我试过像这样不同的过滤器组合

 FILTER(?p1 != ?p2) 
 FILTER(?p1 != ?p3)
 FILTER(?p1 < ?p2)
还有Stanislav Kralin的询问

:A  :B  :E  
:A  :B  :F
:A  :C  :E  
:C  :D  :E  
区别只是:B:D:E

因此,这两个查询都按预期工作。再次感谢

如果有人想测试这个图,这里是本体

@prefix : <http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186> .

<http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186> rdf:type owl:Ontology .

#################################################################
#    Object Properties
#################################################################

###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#hasBadRel
:hasBadRel rdf:type owl:ObjectProperty ;
           rdfs:subPropertyOf owl:topObjectProperty .


###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#hasGoodRel
:hasGoodRel rdf:type owl:ObjectProperty ;
            rdfs:subPropertyOf owl:topObjectProperty .


#################################################################
#    Classes
#################################################################

###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#Person
:Person rdf:type owl:Class .


#################################################################
#    Individuals
#################################################################

###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#A
:A rdf:type owl:NamedIndividual ,
            :Person ;
   :hasBadRel :E ;
   :hasGoodRel :B ,
               :C .


###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#B
:B rdf:type owl:NamedIndividual ,
            :Person ;
   :hasBadRel :D ,
              :E ;
   :hasGoodRel :A .


###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#C
:C rdf:type owl:NamedIndividual ,
            :Person ;
   :hasGoodRel :E .


###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#D
:D rdf:type owl:NamedIndividual ,
            :Person ;
   :hasBadRel :B ;
   :hasGoodRel :C .


###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#E
:E rdf:type owl:NamedIndividual ,
            :Person ;
   :hasBadRel :A ,
              :B ,
              :D .


###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#F
:F rdf:type owl:NamedIndividual ,
            :Person ;
   :hasBadRel :A ,
              :B .


###  Generated by the OWL API (version 4.2.8.20170104-2310) https://github.com/owlcs/owlapi
@前缀:。
@前缀owl:。
@前缀rdf:。
@前缀xml:。
@前缀xsd:。
@前缀rdfs:。
@基地。
rdf:type owl:Ontology。
#################################################################
#对象属性
#################################################################
###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#hasBadRel
:hasBadRel rdf:type owl:ObjectProperty;
rdfs:owl:TopObject属性的子属性。
###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#hasGoodRel
:hasGoodRel rdf:type owl:ObjectProperty;
rdfs:owl:TopObject属性的子属性。
#################################################################
#班级
#################################################################
###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#Person
:Person rdf:type owl:Class。
#################################################################
#个人
#################################################################
###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#A
:A rdf:type owl:NamedIndividual,
:人;
:hasBadRel:E;
:hasGoodRel:B,
:C。
###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#B
:B rdf:type owl:NamedIndividual,
:人;
:hasBadRel:D,
:E;
当前位置hasGoodRel:A。
###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#C
:C rdf:type owl:NamedIndividual,
:人;
:hasGoodRel:E。
###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#D
:D rdf:type owl:NamedIndividual,
:人;
:hasBadRel:B;
:hasGoodRel:C。
###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#E
:E rdf:type owl:NamedIndividual,
:人;
:hasBadRel:A,
:B,
:D。
###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#F
:F rdf:type owl:NamedIndividual,
:人;
:hasBadRel:A,
:B。
###由OWL API生成(版本4.2.8.20170104-2310)https://github.com/owlcs/owlapi

我的想法是将SPARQL 1.1属性路径与模式
:p1 |:p2
一起使用,并检查三个节点之间的路径
n1-n2-n3-n1

前缀g: 挑选* 在哪里{ ?p1 g:hasGoodRel | g:hasBadRel?p2。 ?p2 g:hasGoodRel | g:hasBadRel?p3。 ?p3 g:hasGoodRel | g:hasBadRel?p1 滤波器(str(?p1) 注意,我的解决方案假设只允许使用其中一个关系的路径。比如说

n1 --hasGoodRel--> n2 --hasGoodRel--> n3 --hasGoodRel--> n1
更新

为了考虑无向图,我们必须使用一个附加的属性路径表达式<代码> p ^ p/代码>,它通过代码> > p>代码>

来考虑输入和输出边。 前缀g: 选择不同的* 在哪里{ p1(g:hasGoodRel | ^g:hasGoodRel)|(g:hasBadRel | ^g:hasBadRel)?p2。 p2(g:hasGoodRel | ^g:hasGoodRel)|(g:hasBadRel | ^g:hasBadRel)?p3。 p3(g:hasGoodRel | ^g:hasGoodRel)|(g:hasBadRel | ^g:hasBadRel)?p1 滤波器(str(?p1) 输出 根据该理论,关系应该是“异质的”,即。E好的和坏的关系都应该以三角形出现。因此,您的查询可以是:

前缀pref:
选择不同的?s1?s2?s3
何处{
{
s1 pref:hasGoodRel ^ pref:hasGoodRel?s2。
?s1 pref:hasGoodRel ^ pref:hasGoodRel?s3。
?s2 pref:hasBadRel ^ pref:hasBadRel?s3。
}
联合
{
s1 pref:hasBadRel ^ pref:hasBadRel?s2。
s1 pref:hasBadRel ^ pref:hasBadRel?s3。
?s2 pref:hasGoodRel ^ pref:hasGoodRel?s3。
}
滤波器(str(?s2)
这个想法是,只有两种“情况”:“两个好,一个坏”和“两个坏,一个好”

在每个“情况”中,
?s1
都是单音绑定的,而
?s2
?s3
则不是。然后,
FILTER
子句强制对
?s2
?s3
进行单音绑定


如果不使用
UNION
,似乎很难找出合适的
过滤器
条件(检查AKSW答案中的条件在这种情况下是否不合适)。然而,这是可能的

前缀pref:
选择不同的?s1?s2?s3,其中{
s1 pref:hasGoodRel ^ pref:hasGoodRel?s2。
s1 pref:hasBadRel ^ pref:hasBadRel?s3。
s2 pref:hasBadRel | ^pref:hasBadRel | pref:hasGoodRel | ^pref:hasGoodRel?s3。
结合((str(?s1)>str(?s2))为?x)。
结合((str(?s2)>str(?s3))为y)。
结合((str(?s1)
下面是完整的RDF测试数据。一个正确的查询应该返回12个结果:每个字母A–L正好有一个结果

@prefix  pref: <http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#> 

pref:A1 pref:hasGoodRel pref:A2 .
pref:A1 pref:hasBadRel pref:A3 .
pref:A2 pref:hasBadRel pref:A3 .

pref:B1 pref:hasBadRel pref:B2 .
pref:B1 pref:hasGoodRel pref:B3 .
pref:B2 pref:hasBadRel pref:B3 .

pref:C1 pref:hasGoodRel pref:C2 .
pref:C1 pref:hasBadRel pref:C3 .
pref:C2 pref:hasBadRel pref:C3 .

pref:D1 pref:hasBadRel pref:D2 .
pref:D1 pref:hasGoodRel pref:D3 .
pref:D2 pref:hasBadRel pref:D3 .

pref:E1 pref:hasBadRel pref:E2 .
pref:E1 pref:hasBadRel pref:E3 .
pref:E2 pref:hasGoodRel pref:E3 .

pref:F1 pref:hasBadRel pref:F2 .
pref:F1 pref:hasBadRel pref:F3 .
pref:F2 pref:hasGoodRel pref:F3 .

#################

pref:G1 pref:hasBadRel pref:G2 .
pref:G1 pref:hasGoodRel pref:G3 .
pref:G2 pref:hasGoodRel pref:G3 .

pref:H1 pref:hasGoodRel pref:H2 .
pref:H1 pref:hasBadRel pref:H3 .
pref:H2 pref:hasGoodRel pref:H3 .

pref:I1 pref:hasBadRel pref:I2 .
pref:I1 pref:hasGoodRel pref:I3 .
pref:I2 pref:hasGoodRel pref:I3 .

pref:J1 pref:hasGoodRel pref:J2 .
pref:J1 pref:hasBadRel pref:J3 .
pref:J2 pref:hasGoodRel pref:J3 .

pref:K1 pref:hasGoodRel pref:K2 .
pref:K1 pref:hasGoodRel pref:K3 .
pref:K2 pref:hasBadRel pref:K3 .

pref:L1 pref:hasGoodRel pref:L2 .
pref:L1 pref:hasGoodRel pref:L3 .
pref:L2 pref:hasBadRel pref:L3 .

它应该至少有一个坏的或一个好的关系。好的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的坏的是可能的
@prefix : <http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186> .

<http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186> rdf:type owl:Ontology .

#################################################################
#    Object Properties
#################################################################

###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#hasBadRel
:hasBadRel rdf:type owl:ObjectProperty ;
           rdfs:subPropertyOf owl:topObjectProperty .


###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#hasGoodRel
:hasGoodRel rdf:type owl:ObjectProperty ;
            rdfs:subPropertyOf owl:topObjectProperty .


#################################################################
#    Classes
#################################################################

###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#Person
:Person rdf:type owl:Class .


#################################################################
#    Individuals
#################################################################

###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#A
:A rdf:type owl:NamedIndividual ,
            :Person ;
   :hasBadRel :E ;
   :hasGoodRel :B ,
               :C .


###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#B
:B rdf:type owl:NamedIndividual ,
            :Person ;
   :hasBadRel :D ,
              :E ;
   :hasGoodRel :A .


###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#C
:C rdf:type owl:NamedIndividual ,
            :Person ;
   :hasGoodRel :E .


###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#D
:D rdf:type owl:NamedIndividual ,
            :Person ;
   :hasBadRel :B ;
   :hasGoodRel :C .


###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#E
:E rdf:type owl:NamedIndividual ,
            :Person ;
   :hasBadRel :A ,
              :B ,
              :D .


###  http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#F
:F rdf:type owl:NamedIndividual ,
            :Person ;
   :hasBadRel :A ,
              :B .


###  Generated by the OWL API (version 4.2.8.20170104-2310) https://github.com/owlcs/owlapi
n1 --hasGoodRel--> n2 --hasGoodRel--> n3 --hasGoodRel--> n1
+-----+-----+-----+
| p1  | p2  | p3  |
+-----+-----+-----+
|  :A |  :B |  :C |
|  :A |  :B |  :G |
|  :C |  :D |  :E |
|  :C |  :D |  :F |
+-----+-----+-----+
@prefix  pref: <http://www.semanticweb.org/anato/ontologies/2017/7/untitled-ontology-186#> 

pref:A1 pref:hasGoodRel pref:A2 .
pref:A1 pref:hasBadRel pref:A3 .
pref:A2 pref:hasBadRel pref:A3 .

pref:B1 pref:hasBadRel pref:B2 .
pref:B1 pref:hasGoodRel pref:B3 .
pref:B2 pref:hasBadRel pref:B3 .

pref:C1 pref:hasGoodRel pref:C2 .
pref:C1 pref:hasBadRel pref:C3 .
pref:C2 pref:hasBadRel pref:C3 .

pref:D1 pref:hasBadRel pref:D2 .
pref:D1 pref:hasGoodRel pref:D3 .
pref:D2 pref:hasBadRel pref:D3 .

pref:E1 pref:hasBadRel pref:E2 .
pref:E1 pref:hasBadRel pref:E3 .
pref:E2 pref:hasGoodRel pref:E3 .

pref:F1 pref:hasBadRel pref:F2 .
pref:F1 pref:hasBadRel pref:F3 .
pref:F2 pref:hasGoodRel pref:F3 .

#################

pref:G1 pref:hasBadRel pref:G2 .
pref:G1 pref:hasGoodRel pref:G3 .
pref:G2 pref:hasGoodRel pref:G3 .

pref:H1 pref:hasGoodRel pref:H2 .
pref:H1 pref:hasBadRel pref:H3 .
pref:H2 pref:hasGoodRel pref:H3 .

pref:I1 pref:hasBadRel pref:I2 .
pref:I1 pref:hasGoodRel pref:I3 .
pref:I2 pref:hasGoodRel pref:I3 .

pref:J1 pref:hasGoodRel pref:J2 .
pref:J1 pref:hasBadRel pref:J3 .
pref:J2 pref:hasGoodRel pref:J3 .

pref:K1 pref:hasGoodRel pref:K2 .
pref:K1 pref:hasGoodRel pref:K3 .
pref:K2 pref:hasBadRel pref:K3 .

pref:L1 pref:hasGoodRel pref:L2 .
pref:L1 pref:hasGoodRel pref:L3 .
pref:L2 pref:hasBadRel pref:L3 .
Do[Print[BooleanMinimize[BooleanFunction[i, {x,y,z}]]], {i, 1, 255, 1}]