使用SPARQL和OWL解决3x3 Sudoku问题

时间:2017-06-27 20:33:37

标签: sparql owl

我正在尝试使用SPARQL和OWL解决query.wikidata.org中的简单3x3数独游戏。

3x3 Sudoku game

PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT ?a12 ?a13 ?a21 ?a23 ?a31 ?a32 WHERE{

:Zahl a owl:Class;
        owl:oneOf (:1 :2 :3) .


?a12 a :Zahl.
?a13 a :Zahl.
?a21 a :Zahl.
?a23 a :Zahl.
?a31 a :Zahl.
?a32 a :Zahl.

?a11 owl:sameAs :1.
?a22 owl:sameAs :2.
?a33 owl:sameAs :3.

?a12 owl:differentFrom ?a11 ?a13 ?a22 ?a32.
?a13 owl:differentFrom ?a11 ?a12 ?a23 ?a33.
?a21 owl:differentFrom ?a22 ?a23 ?a11 ?a31.
?a23 owl:differentFrom ?a22 ?a21 ?a13 ?a33.
?a31 owl:differentFrom ?a11 ?a21 ?a32 ?a33.
?a32 owl:differentFrom ?a12 ?a22 ?a31 ?a33.
}

但是我收到了这个错误:

Query is malformed: Encountered " <PNAME_LN> "owl:oneOf "" at line 5, column 19.

有人可以指出我的错误吗?

2 个答案:

答案 0 :(得分:1)

你好卡尔斯鲁厄的朋友,

您的基本错误是您尝试在查询中定义对象 - :Zahl a owl:Class;         猫头鹰:oneOf(:1:2:3)。

查询不是那个地方。这只能在rdf文档中完成 - 在练习中不应该更改。 另一个错误是对对象和文字的错误理解: ......猫头鹰:oneOf(:1:2:3)。 ... ?a11 owl:sameAs:1。 ?a22 owl:sameAs:2。 ?a33 owl:sameAs:3。

owl:sameAs不会对文字进行推卸,因此这些是名为1,2和3的对象。您可以使用名为1,2,3的对象,但使用数字(文字)和使用过滤器(FILTER(?a11 = 1))。

基于我们的源rdf,我认为这是应该做的事情,因为这些是定义的文字: ex:field ex:允许“1”^^ xsd:int, “2” ^^的xsd:INT, “3” ^^的xsd:int类型。 干杯!

答案 1 :(得分:1)

正如HarrySack_overflow已经提到的那样,Zahl的定义(在练习它的字段中)已经在图中(毕竟你正在查询,而不是定义)。 :可以定义字段并将其上传到图表中:

@prefix ex: <http://example.org/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

ex:field ex:allowed "1"^^xsd:int,
"2"^^xsd:int,
"3"^^xsd:int.

我们可以通过:field :allowed <<fieldVariableName>> .

查询其他字段的所有允许值来找到解决方案

最后,我们检查所有解决方案的有效性。在3x3 Sudoku中,每个行/列已经给出了一个值,这可以通过检查每行/每列的总和来实现。解决方案可能如下所示(预定义字段分配给变量以提高可读性):

PREFIX : <http://example.org/> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?a1 ?a2 ?a3 ?b1 ?b2 ?b3 ?c1 ?c2 ?c3
WHERE {
  BIND("1"^^xsd:integer AS ?a1)
  BIND("2"^^xsd:integer AS ?b2)
  BIND("3"^^xsd:integer AS ?c3)

  :field :allowed ?a2, ?a3, ?b1, ?b3, ?c1, ?c2 .

  #CHECK ROWS
  FILTER(?a1 + ?a2 + ?a3 = 6)
  FILTER(?b1 + ?b2 + ?b3 = 6)
  FILTER(?c1 + ?c2 + ?c3 = 6)

  #CHECK COLUMNS
  FILTER(?a1 + ?b1 + ?c1 = 6)
  FILTER(?a2 + ?b2 + ?c2 = 6)
  FILTER(?a3 + ?b3 + ?c3 = 6)
}